Начиная с Python 3.3, алгоритм хеширования недетерминированно salted, чтобы избежать определенного вида атаки. Это удобно для веб-серверов, но при попытке отладки программы возникает боль: каждый раз, когда я запускаю свой скрипт, содержимое dict повторяется в другом порядке.Отключить хеш-рандомизацию изнутри программы python
Некоторые ранние версии питона имели -R
флаг позволяющий хэш рандомизации, но теперь, когда это поведение по умолчанию, флаг не был заменен на свою противоположность. рандомизация может быть отключена путем установки переменной окружения PYTHONHASHSEED
:
PYTHONHASHSEED
Если эта переменная не установлена или установлена на случайное, случайное значение используется для семян хэши, ул байтов и datetime.
Если значение PYTHONHASHSEED равно целочисленному значению, оно используется как фиксированное семя для генерации хеша() типов, охватываемых хэш-рандомизацией.
Уловка заключается в том, что эта переменная должна быть установлена перед запуском процесса python. Я попытался установить его с помощью os.putenv()
или в os.environ
, но они, похоже, не влияют на метод хэширования. Это не слишком удивительно: я бы не ожидал, что python проверит среду перед каждым набором или поиском словаря! Итак, остается вопрос:
Есть ли способ для программы python отключить собственную хэш-рандомизацию?
Это должно произойти, прежде чем любой фактический код Python выполняется; к тому времени слишком много строк были хэшированы и помещены в такие вещи, как тип и модуль '__dict__'s. – user2357112
Я думал то же самое; но я надеюсь, что кто-то, кто знает больше, может прокомментировать. – alexis
Это соответствующие коммиты: [f4b7ecf8a5f8] (https://hg.python.org/cpython/rev/f4b7ecf8a5f8) и [6b7704fe1be1] (https://hg.python.org/cpython/rev/6b7704fe1be1) - взгляд через него я не сразу вижу решение, но это отправная точка. – dimo414