【发布时间】:2015-08-15 14:20:59
【问题描述】:
从 Python 3.3 开始,哈希算法是非确定性的salted 以避免某种攻击。这对网络服务器来说很好,但在尝试调试程序时会很痛苦:每次我运行我的脚本时,dict 内容都会以不同的顺序迭代。
一些早期版本的 python 有一个-R 标志用于启用散列随机化,但现在它是默认行为,该标志并没有被它的反面取代。
可以通过设置环境变量PYTHONHASHSEED来禁用随机化:
PYTHONHASHSEED
如果此变量未设置或设置为随机,则使用随机值作为 str、bytes 和 datetime 对象的哈希值的种子。
如果 PYTHONHASHSEED 设置为整数值,则将其用作固定种子,用于生成散列随机化涵盖的类型的 hash()。
关键是这个变量必须在启动 python 进程之前设置。我尝试使用os.putenv() 或os.environ 设置它,但这些似乎对散列方法没有影响。这并不奇怪:我不希望 python 在每个集合或字典查找之前检查环境!所以,问题仍然存在:
python 程序有没有办法禁用自己的哈希随机化?
【问题讨论】:
-
这必须在任何实际的 Python 代码执行之前发生;到那时,已经有太多的字符串被散列并放入诸如类型和模块
__dict__s 之类的东西中。 -
我也是这么想的;但我希望知道更多的人可以发表评论。
-
这些是相关的提交:f4b7ecf8a5f8 和 6b7704fe1be1 - 浏览一下我没有立即看到解决方案,但这是一个起点。
-
这种普通旧散列的随机化实际上不是一个特性。应该有一个完全可靠、不安全、体面的内置散列器,可用于在进程和会话之间创建相同的标识符。 Python3 的哈希器在所有方面或多或少都失败了。如果我们允许,安全任务蠕变将杀死 Python(Perl 已死,Python 也可以); Python3 不是一种安全语言,正如办公室或厨房不是建筑物的安全部分一样。
标签: python python-3.x hash