Начиная с Python 3.3, алгоритм хеширования недетерминированно salted, чтобы избежать определенного вида атаки. Это хорошо для веб-серверов, но это боль при попытке отладки программы: каждый раз, когда я запускаю свой script, содержимое dict повторяется в другом порядке.
В некоторых более ранних версиях python был флаг -R
для включения хеш-рандомизации, но теперь, когда это поведение по умолчанию, флаг не был заменен его противоположностью.
Рандомизация может быть отключена установкой переменной окружения PYTHONHASHSEED
:
PYTHONHASHSEED
Если эта переменная не задана или не задана случайной, случайное значение используется для семени хэшей объектов str, bytes и datetime.
Если значение PYTHONHASHSEED установлено на целочисленное значение, оно используется как фиксированное семя для генерации хеша() типов, охватываемых хэш-рандомизацией.
Ловушка заключается в том, что эта переменная должна быть установлена перед запуском процесса python. Я попытался установить его с помощью os.putenv()
или в os.environ
, но они, похоже, не влияют на метод хэширования. Это не слишком удивительно: я бы не ожидал, что python проверит среду перед каждым набором или поиском словаря! Итак, остается вопрос:
Есть ли способ для программы python отключить собственную хэш-рандомизацию?