Большинство ответов предполагают, что это происходит из-за различных платформ, но есть больше к нему. От the documentation of object.__hash__(self)
:
По умолчанию __hash__()
значения str
, bytes
и datetime
объектов «соленый» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.
Предназначен для обеспечения защиты от отказа в обслуживании , вызванного тщательно подобранными входами, которые используют наихудший случай производительность вставки, о (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
это обязаны тем, ваш WinXP является 32-битной платформе в то время как Google, это 64 бит –