Отключить хеш-рандомизацию из программы python

Начиная с Python 3.3, алгоритм хеширования не является детерминированным, чтобы избежать определенной атаки. Это удобно для веб-серверов, но при попытке отладки программы возникает боль: каждый раз, когда я запускаю свой скрипт, содержимое dict повторяется в другом порядке.

В некоторых более ранних версиях python был флаг -R для включения хэш-рандомизации, но теперь, когда это поведение по умолчанию, флаг не был заменен его противоположностью. Рандомизация может быть отключена установкой переменной окружения PYTHONHASHSEED :

PYTHONHASHSEED

Если эта переменная не установлена ​​или установлена ​​на случайную величину, случайное значение используется для выделения хэшей объектов str, bytes и datetime.
Если значение PYTHONHASHSEED установлено на целочисленное значение, оно используется как фиксированное семя для генерации хеша () типов, охватываемых хэш-рандомизацией.

Уловка заключается в том, что эта переменная должна быть установлена ​​перед запуском процесса python. Я попытался установить его с os.putenv() или в os.environ , но они, похоже, не влияют на метод хэширования. Это не слишком удивительно: я бы не ожидал, что python проверит среду перед каждым набором или поиском словаря! Итак, остается вопрос:

Есть ли способ для программы python отключить собственную хэш-рандомизацию?

One Solution collect form web for “Отключить хеш-рандомизацию из программы python”

Я подозреваю, что это невозможно, к сожалению. Глядя на test_hash.py в коммит, который ввел это поведение, был добавлен класс HashRandomizationTests и его потомки. Они проверяют поведение хэширования, изменяя среду и запуская новый процесс с явно установленным PYTHONHASHSEED . Возможно, вы могли бы попытаться скопировать этот шаблон.

Я также просто заметил, что вы сказали: « Каждый раз, когда я запускаю свой скрипт, содержимое dict повторяется в другом порядке». – Я полагаю, вы знаете о collections.OrderedDict , правда? Это нормальный способ получить надежную итерацию хэширования.


Если вы хотите установить значение в среде оболочки, вы также можете просто обернуть свой вызов python в сценарий bash, например

 #! /bin/bash export PYTHONHASHSEED=0 # call your python program here 

Это позволяет избежать необходимости манипулировать всей вашей средой, если вы в порядке с сценарием оболочки.

Или просто просто передайте значение в командной строке:

 $ PYTHONHASHSEED=0 python YOURSCRIPT.py 
Python - лучший язык программирования в мире.