Більшість відповідей припускають, що це пов’язано з різними платформами, але в цьому є й більше. З документаціїobject.__hash__(self) :
За замовчуванням __hash__()значення str, bytesі
datetimeоб'єкти «солоні» з непередбачуваним випадковим значенням. Хоча вони залишаються незмінними в межах окремого процесу Python, їх не можна передбачити між повторними викликами Python.
Це призначено для забезпечення захисту від відмови в обслуговуванні, спричиненої ретельно підібраними вхідними даними, які використовують найгіршу ефективність вставки дикту, складність 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