从Python 3.3开始,哈希算法是非确定性的salted以避免某种攻击。这对于网络服务器来说很好,但在尝试调试程序时却很痛苦:每次运行脚本时,字典内容都会以不同的顺序迭代。
一些早期版本的 python 有一个-R
标记为enabling哈希随机化,但现在它是默认行为,该标志尚未被其相反的状态所取代。
可以通过设置环境变量来禁用随机化PYTHONHASHSEED:
Python哈希种子
如果此变量未设置或设置为随机,则使用随机值作为 str、bytes 和 datetime 对象的哈希值的种子。
如果 PYTHONHASHSEED 设置为整数值,则它将用作生成哈希随机化所涵盖的类型的 hash() 的固定种子。
问题是这个变量必须在启动 python 进程之前设置。我尝试将其设置为os.putenv()
, or in os.environ
,但是这些似乎对哈希方法没有影响。这并不奇怪:我不希望 python 在每个集合或字典查找之前检查环境!所以,问题依然存在:
python 程序有没有办法禁用自己的哈希随机化?
不幸的是,我怀疑这是不可能的。看着test_hash.py the HashRandomizationTests
类及其后代被添加到引入此行为的提交。他们通过修改环境并启动一个新进程来测试哈希行为PYTHONHASHSEED
明确设定。也许你可以尝试复制这种模式。
我也刚刚注意到你说“每次我运行脚本时,字典内容都会以不同的顺序迭代。“ - 我想你知道collections.OrderedDict, 正确的?这是获得可靠的哈希迭代的正常方法。
如果您愿意在 shell 环境中设置该值,您也可以将 python 调用包装在 bash 脚本中,例如
#! /bin/bash
export PYTHONHASHSEED=0
# call your python program here
只要您可以使用包装脚本,就可以避免操作整个环境。
或者甚至只是在命令行上传递值:
$ PYTHONHASHSEED=0 python YOURSCRIPT.py
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)