La plupart des réponses suggèrent que cela est dû aux différentes plateformes, mais ce n'est pas tout. De la documentation de object.__hash__(self)
:
Par défaut, le __hash__()
les valeurs de str
, bytes
y datetime
sont "salés" avec une valeur aléatoire imprévisible. Bien qu'ils restent constants au sein d'un processus Python individuel, ils ne sont pas prévisibles entre les invocations répétées de Python.
Il s'agit d'assurer une protection contre un déni de service. causé par des entrées soigneusement choisies qui exploitent les pires performances d'une insertion de dict d'une insertion de dict, d'une complexité de O(n²). [ ] 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 de la fonction dicts
, sets
et d'autres correspondances. Python n'a jamais garanti cet ordre (et il varie généralement entre les versions 32 bits et 64 bits).
Même sur la même machine, les résultats varieront d'une invocation à l'autre :
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Tandis que :
$ 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 si elle est définie à random
une valeur aléatoire est utilisée pour ensemencer les hachages de str
, bytes
y datetime
objets.
Si PYTHONHASHSEED
est fixé à une valeur entière fixe pour générer le hash()
des types couverts par le hachage la randomisation.
Son but est de permettre un hachage répétable, comme pour les autotests de l'interpréteur lui-même, ou pour permettre à une grappe de processus python de de partager des valeurs de hachage.
L'entier doit être un nombre décimal compris dans l'intervalle [0, 4294967295]
. 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