Мне нужно получить случайное хеш-семя, используемое питоном для репликации сбой unittests.Экстракт хеш-семени в модульном тестировании
Если PYTHONHASHSEED установлена в ненулевое целое число, sys.flags.hash_randomization
обеспечивает его надежно:
$ export PYTHONHASHSEED=12345
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
12345 12345
Однако если хеширование рандомизированное, говорится только , что используется семя, не которые:
$ export PYTHONHASHSEED=random
$ python3 -c 'import sys, os;print(sys.flags.hash_randomization, os.environ.get("PYTHONHASHSEED"))'
1 random
Информация в sys.hash_info
никогда не включает данные в зависимости от семени. С hash function since python3.4, кажется также неосуществимым попробовать и восстановить семя от данных хешей.
Контекст: Когда тонкая настройка алгоритма, мы уже видели Heisenbugs, которые зависят от множества/Dict итерация порядка. Для их тиражирования требуется тестирование семян, в худшем - все 4294967295, но даже наше среднее число ~ 100 тестов довольно длительное.
Мы рассматривали всегда внешнюю установку PYTHONHASHSEED на случайные, но известные значения, но хотели бы избежать этого дополнительного слоя.
Глядя на код, я не думаю, что все возможные состояния 'uc' даже соответствуют значениям« PYTHONHASHSEED ». 'uc' равно 24 байтам, а' PYTHONHASHSEED' - только 4. Без 'PYTHONHASHSEED', Python инициализирует' uc' таким образом, что вряд ли какой-либо «PYTHONHASHSEED» может дать тот же результат. – user2357112
@ пользователь2357112 очень хороший пункт. И вы не можете установить значение 'uc', так как к тому моменту, когда вы могли бы сделать это из программы Python, уже было бы хэшировано много ключей словаря. Установка хэш-файла 'uc' приведет к недействительности всего, что не является интернированной строкой. –
Отличный ответ! Особая благодарность за дополнительную информацию о том, как фактически используется PYTHONHASHSEED. – MisterMiyagi