Большинство ответов предполагают, что это связано с разными платформами, но это еще не все. Из документацииobject.__hash__(self)
:
По умолчанию __hash__()
значения str
, bytes
и
datetime
объекты «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, их нельзя предсказать между повторными вызовами Python.
Это предназначено для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность вставки dict, сложность O (n²). Подробнее см.
Http://www.ocert.org/advisories/ocert-2011-003.html .
Изменение значения хэш - функции влияет на порядок итерации dicts
, sets
и других отображений. Python никогда не давал гарантий относительно этого порядка (и обычно он варьируется между 32-битными и 64-битными сборками).
Даже запуск на одной машине даст разные результаты при вызовах:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
В то время как:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
См. Также переменную окружения PYTHONHASHSEED
:
Если эта переменная не установлена или установлена на random
, случайное значение используется для семян хэши str
, bytes
и datetime
объекты.
Если PYTHONHASHSEED
установлено целочисленное значение, оно используется как фиксированное начальное число для генерации hash()
типов, охватываемых рандомизацией хэша.
Его цель - разрешить повторяемое хеширование, например, для самотестирования самого интерпретатора, или позволить кластеру процессов Python совместно использовать хеш-значения.
Целое число должно быть десятичным числом в диапазоне [0, 4294967295]
. Указание значения 0
отключит рандомизацию хэша.
Например:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305