首先,我知道如何处理这种情况。我不是在问我如何制作OrderedDict
。
我在问为什么同样的字典创建方式可以有不同的键顺序?这背后的逻辑是什么?是不是完全相同的代码运行时间独立和环境无关?什么改变并使python创建不同的结果?
答案 0 :(得分:4)
object.__hash__()
的规范详细说明了这种行为;这是为了防止某些类型的恶意输入破坏应用程序:
注意默认情况下,str,bytes和datetime对象的
__hash__()
值使用不可预测的随机值“加盐”。尽管它们在单个Python进程中保持不变,但在重复调用Python之间无法预测它们。这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html。
在Python 3.3之前,情况并非如此,字典将在同一应用程序的不同运行之间具有相同的顺序。
我回答了related question关于禁用此行为的问题,该行为链接到一些相关的源代码。
答案 1 :(得分:1)
自Python 3.3起,hash randomization is enabled by default出于安全原因。
担心的是,攻击者可以提供特制的程序输入,导致许多哈希冲突。这将导致字典在更糟糕的情况下执行,并且可能有效地导致系统上的拒绝服务。
许多其他常用于Web编程的语言也在大致相同的时间范围内使用各自的哈希映射实现哈希随机化。
在实现散列随机化之前,由于冲突解决和内部散列表调整大小,如果使用不同的插入序列并删除它会产生相同的最终键集,那么你可能不会总是以相同的顺序结束,但是你&# 39;当您以相同的顺序插入和删除键时,d通常在字典中获得相同的顺序。然而,这是一个实施意外,从未得到语言规范的保证。