私は、が失敗する unittestsを複製するためにpythonで使用されるランダムなハッシュシードを取得する必要があります。 PYTHONHASHSEEDはゼロ以外の整数に設定されているユニットテストでハッシュシードを抽出する
場合、sys.flags.hash_randomization
確実にそれを提供する:ハッシュがランダム化された場合
$ export PYTHONHASHSEED=12345
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
12345 12345
しかし、それだけではない、シードが使用さこと述べている:
$ export PYTHONHASHSEED=random
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
1 random
sys.hash_info
の情報には、種によってはデータが含まれません。 hash function since python3.4では、与えられたハッシュからシードを再構築しようとすることも実行不可能です。
コンテキスト:アルゴリズムを微調整するとき、set/dictの反復順序に依存するheisenbugを見てきました。それらを複製するには、最悪の場合は4294967295の種をテストする必要がありますが、私たちの平均でも〜100回のテストでさえかなり時間がかかります。
PYTHONHASHSEEDはランダムであるが既知の値に常に設定していますが、この余分なレイヤーは避けたいと考えています。
コードを見ると、私は 'uc'のすべての可能な状態が' PYTHONHASHSEED'値に対応するとは思いません。 'uc'は24バイトですが、' PYTHONHASHSEED'は4だけです。 'PYTHONHASHSEED'がないと、Pythonは' PYTHONHASHSEED'が同じ結果を生み出すことはないように 'uc'を初期化します。 – user2357112
@ user2357112非常に良い点があります。そしてあなたは 'uc'値を設定することもできません。Pythonプログラムからそうすることができる時代には、既にたくさんの辞書キーがハッシュされていたはずです。 'uc'ハッシュシードを設定すると、中身の文字列ではないものは無効になります。 –
偉大な答え! 'PYTHONHASHSEED'が実際にどのように使われているかについての特別な情報をありがとうございます。 – MisterMiyagi