Documentation index

出力データの順序を固定する(Stable order for outputs)

Perl の連想配列Python の辞書Ruby の Hash オブジェクト にキーのリストを要求すると、実行するたびに異なる順序になります。 アルゴリズムの複雑性に基づく攻撃 を回避するためです。

次のコード例は、実行するたびにリストを異なる順序で出力します。

foreach my $package (keys %deps) {
    print MANIFEST, "$package: $deps[$packages]";
}

決定論的な出力ができるようにする一番簡単な方法は、キーを並び替えることです。

foreach my $package (sort keys %deps) {
    print MANIFEST, "$package: $deps[$packages]";
}

Perl の場合は環境変数で PERL_HASH_SEED=0 としても同じ効果があります。 連想配列のキーが常に同じ順序になるのです。 詳しくは perlrun(1) を参照してください。

Python の場合は環境変数 PYTHONHASHSEED を設定します。 同じ整数値を設定した場合、辞書は常に同じ並び順の要素を返すようになります。

sort コマンドのように、出力が ロケールの設定 に依存する場合もあるので注意してください。


Documentation index

Follow us on Twitter @ReproBuilds, Mastodon @reproducible_builds@fosstodon.org & Reddit and please consider making a donation. • Content licensed under CC BY-SA 4.0, style licensed under MIT. Templates and styles based on the Tor Styleguide. Logos and trademarks belong to their respective owners. • Patches welcome via our Git repository (instructions) or via our mailing list. • Full contact info