Більшість відповідей припускають, що це пов’язано з різними платформами, але в цьому є й більше. З документації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