Python використовує випадкове насіння хешу, щоб запобігти зловмисникам перебирати ваш додаток, надсилаючи вам ключі, призначені для зіткнення. Див. Оригінальне розкриття інформації про вразливість . Завдяки компенсації хешу випадковим насінням (встановленим один раз під час запуску) зловмисники більше не можуть передбачити, які ключі зіткнуться.
Ви можете встановити фіксоване насіння або вимкнути функцію, встановивши PYTHONHASHSEEDзмінну середовища ; типовим значенням є, randomале ви можете встановити для нього фіксоване ціле додатне значення, а 0функцію взагалі вимкнути.
У версіях Python 2.7 та 3.2 функція за замовчуванням вимкнена (використовуйте -Rперемикач або встановіть, PYTHONHASHSEED=randomщоб увімкнути її); це ввімкнено за замовчуванням у Python 3.3 та новіших версіях.
Якщо ви покладалися на порядок ключів у наборі Python, то не робіть цього. Python використовує хеш-таблицю для реалізації цих типів, і їх порядок залежить від історії вставки та видалення , а також випадкового насіння хешу. Зверніть увагу, що в Python 3.5 та старіших версіях це стосується і словників.
Також див. object.__hash__()Документацію до спеціальних методів :
Примітка : За замовчуванням __hash__()значення str, bytes та datetime об’єкти “соляться” з непередбачуваним випадковим значенням. Хоча вони залишаються постійними в межах окремого процесу Python, їх не можна передбачити між повторними викликами Python.
Це призначено для захисту від відмови в обслуговуванні, спричиненої ретельно підібраними вхідними даними, які використовують найгіршу ефективність вставки дикту, складність O (n ^ 2). Детальніше див. На http://www.ocert.org/advisories/ocert-2011-003.html .
Зміна хеш-значень впливає на порядок ітерацій диктів, наборів та інших відображень. Python ніколи не давав гарантій щодо цього впорядкування (і воно зазвичай варіюється між 32-бітовою та 64-бітною збірками).
Дивіться також PYTHONHASHSEED.
Якщо вам потрібна стабільна хеш-реалізація, ви, мабуть, хочете поглянути на hashlibмодуль ; це реалізує криптографічні хеш-функції. Проект pybloom використовує цей підхід .
Оскільки зсув складається з префікса та суфікса (початкове значення та кінцеве значення XORed відповідно), ви не можете просто зберегти зсув, на жаль. Позитивом є те, що це означає, що зловмисники не можуть легко визначити зсув за допомогою атак часу.