ほとんどの回答は、これはプラットフォームが異なるためであることを示唆していますが、それだけではありません。からのドキュメントobject.__hash__(self)
:
デフォルトでは__hash__()
、、および
オブジェクトの値はstr
、予測できないランダムな値で「ソルト」されます。それらは個々のPythonプロセス内で一定のままですが、Pythonを繰り返し呼び出す間で予測することはできません。bytes
datetime
これは、dict挿入の最悪の場合のパフォーマンスであるO(n²)の複雑さを悪用する慎重に選択された入力によって引き起こされるサービス拒否に対する保護を提供することを目的としています。詳細については、
http://www.ocert.org/advisories/ocert-2011-003.htmlを参照してください。
ハッシュ値を変更すると、繰り返しの順序に影響dicts
、sets
および他のマッピングを。Pythonは、この順序について保証していません(通常、32ビットビルドと64ビットビルドの間で異なります)。
同じマシンで実行している場合でも、呼び出し全体でさまざまな結果が得られます。
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
一方:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
環境変数も参照してくださいPYTHONHASHSEED
。
この変数が設定されていないか、に設定されていない場合random
、ランダムな値を使用してstr
、bytes
およびdatetime
オブジェクトのハッシュをシードします。
PYTHONHASHSEED
が整数値に設定されている場合hash()
、ハッシュランダム化の対象となるタイプのを生成するための固定シードとして使用されます。
その目的は、インタープリター自体のセルフテストなど、繰り返し可能なハッシュを許可すること、またはPythonプロセスのクラスターがハッシュ値を共有できるようにすることです。
整数は、範囲内の10進数である必要があります[0, 4294967295]
。値0
を指定すると、ハッシュのランダム化が無効になります。
例えば:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305