Die meisten Antworten deuten darauf hin, dass dies auf unterschiedliche Plattformen zurückzuführen ist, aber es steckt noch mehr dahinter. Aus der Dokumentation vonobject.__hash__(self)
:
Standardmäßig werden die __hash__()
Werte von str
, bytes
und
datetime
sind Objekte „gesalzen“ mit einem unberechenbaren Zufallswert. Obwohl sie innerhalb eines einzelnen Python-Prozesses konstant bleiben, sind sie zwischen wiederholten Aufrufen von Python nicht vorhersehbar.
Dies soll Schutz vor einem Denial-of-Service bieten, der durch sorgfältig ausgewählte Eingaben verursacht wird, die die Worst-Case-Leistung einer Dikt-Einfügung, O (n²) -Komplexität, ausnutzen. Weitere Informationen finden Sie unter
http://www.ocert.org/advisories/ocert-2011-003.html .
Hash - Werte ändern , wirkt sich die Iterationsreihenfolge von dicts
, sets
und andere Abbildungen. Python hat niemals Garantien für diese Reihenfolge gegeben (und sie variiert normalerweise zwischen 32-Bit- und 64-Bit-Builds).
Selbst das Ausführen auf demselben Computer führt zu unterschiedlichen Ergebnissen bei verschiedenen Aufrufen:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Während:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Siehe auch die Umgebungsvariable PYTHONHASHSEED
:
Wenn diese Variable nicht gesetzt ist oder eingestellt random
wird ein Zufallswert verwendet , um die Hash - Werte von Saatgut str
, bytes
und datetime
Objekte.
Wenn PYTHONHASHSEED
ein ganzzahliger Wert festgelegt ist, wird er als fester Startwert zum Generieren der hash()
von der Hash-Randomisierung abgedeckten Typen verwendet.
Der Zweck besteht darin, wiederholbares Hashing zuzulassen, z. B. für Selbsttests für den Interpreter selbst, oder einem Cluster von Python-Prozessen zu ermöglichen, Hash-Werte gemeinsam zu nutzen.
Die Ganzzahl muss eine Dezimalzahl im Bereich sein [0, 4294967295]
. Durch Angabe des Werts 0
wird die Hash-Randomisierung deaktiviert.
Beispielsweise:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305