La plupart des réponses suggèrent que cela est dû au fait des différentes plates-formes, mais il y a plus à elle. De the documentation of object.__hash__(self)
:
Par défaut, les valeurs de __hash__()
str
, bytes
et datetime
objets sont « salés » avec une valeur aléatoire imprévisible. Bien qu'ils restent constants dans un processus Python individuel, ils ne sont pas prévisibles entre les invocations répétées de Python.
Ceci est destiné à fournir une protection contre un déni de service causé par des entrées soigneusement choisies qui exploitent le pire des cas performances d'une insertion dict, O (n²) complexité. Voir http://www.ocert.org/advisories/ocert-2011-003.html pour plus de détails.
La modification des valeurs de hachage affecte l'ordre d'itération dicts
, sets
et d'autres mappages. Python n'a jamais fait de garanties à propos de cette commande (et il varie généralement entre les versions 32 bits et 64 bits).
Même en cours d'exécution sur la même machine donnera des résultats différents à travers les invocations:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Alors:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Voir aussi la variable d'environnement PYTHONHASHSEED
:
Si cette variable n'est pas définie ou définie sur random
, une valeur aléatoire est utilisée pour graver les hachages des objets str
, bytes
et datetime
.
Si PYTHONHASHSEED
est réglé sur une valeur entière, il est utilisé comme une graine fixe pour générer le hash()
des types couverts par la randomisation de hachage .
Son but est de permettre le hachage reproductible, comme pour autotests pour l'interprète lui-même, ou pour permettre à un groupe de processus de python pour partager des valeurs de hachage. Le nombre entier doit être un nombre décimal compris entre [0, 4294967295]
et
. La spécification de la valeur
0
désactive la randomisation du hachage.
Par exemple:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
cela doit à fait votre winxp est une plate-forme 32 bits tandis que Google est 64 bits –