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 відповідно), ви не можете просто зберегти зсув, на жаль. Позитивом є те, що це означає, що зловмисники не можуть легко визначити зсув за допомогою атак часу.