Większość odpowiedzi sugeruje, że dzieje się tak z powodu różnych platform, ale to nie wszystko. Z dokumentacjiobject.__hash__(self)
:
Domyślnie __hash__()
wartości str
, bytes
a
datetime
obiekty są „solone” z nieprzewidywalnym wartości losowej. Chociaż pozostają stałe w ramach pojedynczego procesu Pythona, nie można ich przewidzieć między powtarzającymi się wywołaniami Pythona.
Ma to na celu zapewnienie ochrony przed atakiem typu „odmowa usługi” spowodowanym przez starannie dobrane dane wejściowe, które wykorzystują najgorszą wydajność wstawiania dyktowania, złożoność O (n²). Szczegółowe informacje można
znaleźć pod adresem http://www.ocert.org/advisories/ocert-2011-003.html .
Zmiana wartości hash wpływa na kolejność iteracji dicts
, sets
i innych odwzorowań. Python nigdy nie udzielił gwarancji co do tej kolejności (i zwykle różni się ona między wersjami 32-bitowymi i 64-bitowymi).
Nawet uruchomienie na tej samej maszynie da różne wyniki w różnych wywołaniach:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Podczas:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Zobacz także zmienną środowiskową PYTHONHASHSEED
:
Jeśli zmienna ta nie jest ustawiony lub ustawiony na random
wartość losową służy do materiału siewnego mieszań o str
, bytes
i datetime
przedmioty.
Jeśli PYTHONHASHSEED
jest ustawiona na wartość całkowitą, jest używana jako stałe ziarno do generowania hash()
typów objętych randomizacją skrótu.
Jego celem jest umożliwienie powtarzalnego mieszania, na przykład autotestów samego interpretera, lub umożliwienie klastra procesów Pythona współdzielenia wartości skrótu.
Liczba całkowita musi być liczbą dziesiętną z zakresu [0, 4294967295]
. Określenie wartości 0
spowoduje wyłączenie randomizacji skrótów.
Na przykład:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305