关于字典:为什么python dict键的顺序不一致?

Why is the order of python dict keys not consistent?

本问题已经有最佳答案,请猛点这里访问。

首先,我知道如何处理这种情况。我不是在问我怎么做一个OrderedDict

我在问为什么相同的字典以相同的方式创建,可以有不同的键顺序?这背后的逻辑是什么?这不是完全相同的代码运行时独立和环境独立吗?什么变化和使python产生不同的结果?


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

Note By default, the __hash__() values of str, bytes and datetime objects are"salted" with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.

This is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a dict insertion, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details.

在python 3.3之前,情况并非如此,同一个应用程序的不同运行之间的字典顺序相同。

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


自python 3.3以来,由于安全原因,默认情况下会启用散列随机化。

问题在于,攻击者可以向精心设计的程序输入提供数据,从而导致许多哈希冲突。这将导致字典在更糟的情况下执行,并可能有效地导致系统上的拒绝服务。

许多其他经常用于Web编程的语言也在大致相同的时间段内实现了散列随机化,以及各自的散列图。

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