Większość odpowiedzi sugerują, że to właśnie z powodu różnych platformach, ale nie więcej. Od the documentation of object.__hash__(self)
:
Domyślnie wartości __hash__()
z str
, bytes
i datetime
obiektów są „solone” z nieprzewidywalnym wartości losowej. Mimo że pozostają one stałe w ramach pojedynczego procesu Pythona, , nie można ich przewidzieć między powtórzonymi wywołaniami Pythona.
ten przeznaczony jest do ochrony przed zaprzeczenie of Service spowodowane starannie wybranych wejść wykorzystujących najgorszym przypadku wydajność wstawiania dict O (n²) komplikacji. Aby uzyskać szczegółowe informacje, patrz http://www.ocert.org/advisories/ocert-2011-003.html.
Zmiana wartości mieszania wpływa na kolejność iteracji dicts
, sets
i inne odwzorowania. Python nigdy nie udzielił gwarancji na to zamówienie (zazwyczaj jest to wersja 32-bitowa i 64-bitowa).
Nawet działa na tej samej maszynie dadzą różne wyniki całej inwokacji:
$ 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 również zmienna środowiskowa PYTHONHASHSEED
:
Jeśli ta zmienna nie jest ustawiona lub ustawiona na random
, używana jest wartość losowa do wysiewania haszy obiektów str
, i datetime
.
PYTHONHASHSEED
Jeśli ustawiony jest liczbą całkowitą, a stosuje się go w postaci stałej nasiona do generowania hash()
typów objętych mieszania randomizacją.
Jego celem jest umożliwienie powtarzalnego haszowania, na przykład dla autotranslatorów dla samego tłumacza, lub zezwolenie na klastry procesów Pythona na udostępnianie wartości skrótów.
Liczba całkowita musi być liczbą dziesiętną z zakresu [0, 4294967295]
. Określenie wartości 0
spowoduje wyłączenie losowania mieszania.
Na przykład:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
to zawdzięczam fakt Twój WinXP 32bit jest platforma Google jest natomiast 64-bitowy –