La mayoría de las respuestas sugieren que esto se debe a las diferentes plataformas, pero hay más. De la documentación deobject.__hash__(self)
:
Por defecto, los __hash__()
valores de str
, bytes
y
datetime
los objetos se “salada” con un valor aleatorio impredecible. Aunque permanecen constantes dentro de un proceso de Python individual, no son predecibles entre invocaciones repetidas de Python.
Esto tiene como objetivo proporcionar protección contra una denegación de servicio causada por entradas cuidadosamente seleccionadas que aprovechan el peor de los casos de una inserción de dict, complejidad O (n²). Consulte
http://www.ocert.org/advisories/ocert-2011-003.html para obtener más detalles.
Cambio de valores hash afecta al orden de iteración dicts
, sets
y otras asignaciones. Python nunca ha ofrecido garantías sobre este pedido (y normalmente varía entre compilaciones de 32 y 64 bits).
Incluso la ejecución en la misma máquina producirá resultados variables en todas las invocaciones:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Mientras:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Consulte también la variable de entorno PYTHONHASHSEED
:
Si esta variable no se establece o se establece en random
, un valor aleatorio se utiliza para sembrar los hashes de str
, bytes
y datetime
objetos.
Si PYTHONHASHSEED
se establece en un valor entero, se utiliza como semilla fija para generar hash()
los tipos cubiertos por la aleatorización hash.
Su propósito es permitir el hash repetible, como las autopruebas del propio intérprete, o permitir que un grupo de procesos de Python comparta valores hash.
El número entero debe ser un número decimal en el rango [0, 4294967295]
. Especificar el valor 0
desactivará la aleatorización de hash.
Por ejemplo:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305