在以下代码中。
>>> hash('bar')
327024216814240868
>>> hash('baz')
327024216814240876
>>> hash('bar') % 8
4
>>> hash('baz') % 8
4
然而, bar
和baz
的哈希值恰好相差8,因此映射到完全相同的广告位4
:
他们的订单现在取决于首先插入哪个密钥;第二个密钥必须移动到下一个插槽:
>>> {'baz': None, 'bar': None}
{'bar': None, 'baz': None}
>>> {'bar': None, 'baz': None}
{'baz': None, 'bar': None}
但是这两个输出必须与bar
的哈希值相同,而不是baz
。
我的意思是,
>>>{'bar': None, 'baz': None}
应该来,
{'bar': None, 'baz': None}
答案 0 :(得分:1)
从Python版本安全版本https://mail.python.org/pipermail/python-announce-list/2012-March/009394.html
哈希随机化导致dicts和sets的迭代顺序为 Python运行中不可预测且不同。 Python从未保证过 dict或set中键的迭代顺序,建议应用程序永远不要 依靠它。从历史上看,dict迭代顺序并没有经常发生变化 释放并且在连续执行之间始终保持一致 蟒蛇。因此,一些现有的应用程序可能依赖于字典或集合排序。 正因为如此,许多Python应用程序都不接受 在所有稳定的Python版本中,不受信任的输入都不容易受到此攻击 这里提到, 默认情况下禁用哈希随机化 。有两种方法可以 启用它。 -R命令行选项可以传递给python可执行文件。它 也可以通过设置环境变量 pythonhashseed 来启用 "随机&#34 ;. (其他值也被接受;将-h传递给python以完成 说明。)