Большинство ответов предполагают, что это связано с разными платформами, но это еще не все. Из документации 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
person
arekolek
schedule
17.11.2015