为什么python dict键的顺序不一致?

为什么python dict键的顺序不一致?,python,dictionary,Python,Dictionary,首先,我知道如何处理这种情况。我不是在问我如何才能下订单 我想问的是,为什么以同样的方式创建的同一本词典可以有不同的键顺序?这背后的逻辑是什么?它不是与运行时间无关和与环境无关完全相同的代码吗?是什么改变了python并使其产生了不同的结果?此行为在的规范中有详细说明;这是为了防止某些类型的恶意输入破坏应用程序: 注意:默认情况下,str、bytes和datetime对象的\uuuuu hash\uuuu()值是用不可预测的随机值“salt”的。尽管它们在单个Python进程中保持不变,但在重复

首先,我知道如何处理这种情况。我不是在问我如何才能下订单


我想问的是,为什么以同样的方式创建的同一本词典可以有不同的键顺序?这背后的逻辑是什么?它不是与运行时间无关和与环境无关完全相同的代码吗?是什么改变了python并使其产生了不同的结果?

此行为在的规范中有详细说明;这是为了防止某些类型的恶意输入破坏应用程序:

注意:默认情况下,str、bytes和datetime对象的
\uuuuu hash\uuuu()
值是用不可预测的随机值“salt”的。尽管它们在单个Python进程中保持不变,但在重复调用Python之间是不可预测的

这是为了提供保护,防止由于精心选择的输入导致的拒绝服务,这些输入利用dict插入的最坏情况性能,O(n^2)复杂性。有关详细信息,请参阅

在Python3.3之前,情况并非如此,字典在同一应用程序的不同运行之间具有相同的顺序


我回答了一个关于禁用此行为的问题,它链接到一些相关的源代码。

此行为在的规范中有详细说明;这是为了防止某些类型的恶意输入破坏应用程序:

注意:默认情况下,str、bytes和datetime对象的
\uuuuu hash\uuuu()
值是用不可预测的随机值“salt”的。尽管它们在单个Python进程中保持不变,但在重复调用Python之间是不可预测的

这是为了提供保护,防止由于精心选择的输入导致的拒绝服务,这些输入利用dict插入的最坏情况性能,O(n^2)复杂性。有关详细信息,请参阅

在Python3.3之前,情况并非如此,字典在同一应用程序的不同运行之间具有相同的顺序

我回答了一个关于禁用此行为的问题,它链接到一些相关的源代码。

自Python 3.3以来,出于安全原因

令人担忧的是,攻击者可能会提供精心编制的程序输入,从而导致许多哈希冲突。这将导致字典在更糟糕的情况下运行,并可能有效地导致系统上的拒绝服务

许多其他经常用于web编程的语言也使用各自的哈希映射在大致相同的时间范围内实现了哈希随机化

在实施散列随机化之前,由于冲突解决和内部散列表大小调整,如果使用不同的插入和移除序列来生成相同的最终键集,则可能不会总是以相同的顺序结束,但是,当您以相同的顺序插入和删除键时,在字典中通常会得到相同的顺序。然而,这是一个意外的实现,语言规范从未保证过这一点。

自Python 3.3以来,出于安全原因

令人担忧的是,攻击者可能会提供精心编制的程序输入,从而导致许多哈希冲突。这将导致字典在更糟糕的情况下运行,并可能有效地导致系统上的拒绝服务

许多其他经常用于web编程的语言也使用各自的哈希映射在大致相同的时间范围内实现了哈希随机化


在实施散列随机化之前,由于冲突解决和内部散列表大小调整,如果使用不同的插入和移除序列来生成相同的最终键集,则可能不会总是以相同的顺序结束,但是,当您以相同的顺序插入和删除键时,在字典中通常会得到相同的顺序。但是,这是一个意外的实现,语言规范从来没有保证过这一点。

我认为问题更多的是为什么每次都不是以相同的方式散列,结果是在相同的表槽中,从而以相同的顺序结束,即使该顺序不是用户指定的/明确排序的/等等。这是一个更有趣的顺序。:)你是对的;更正:)我认为问题更多的是,为什么每次都不是以相同的方式散列,结果是在相同的表槽中,从而以相同的顺序结束,即使该顺序不是用户指定的/明确排序的/等等。这是一个更有趣的问题。:)你是对的;更正:)Python字典以及许多其他语言中的映射类型都是使用实现的。如果您了解了它们是如何工作的,那么您就会理解为什么字典没有有用的排序。哈希函数的结果值可能因底层硬件(32/64位)或可能的其他细微差别(端点)而不同。我希望使用相同版本的Python在同一台机器上运行的相同代码的顺序是相同的。然而,我永远不会相信这一点。@Reti43,…尽管公认的答案对于实现散列随机化的Python版本来说还不准确。这是相关的,但它们不是同一个问题。这是问“为什么排序是任意的”,这是问“为什么排序不一致(在运行之间)”。Python字典以及许多其他语言中的映射类型都是使用。如果您了解了它们是如何工作的,那么您就会理解为什么字典没有有用的排序。哈希函数的结果值可能因底层硬件(32/64位)或可能的其他细微差别(端点)而不同。我希望使用相同版本的Python在同一台机器上运行的相同代码的顺序是相同的。然而,我决不会相信这一点