python dict实现使用散列值来基于密钥稀疏地存储值并避免该存储中的冲突.它使用hash()的结果作为起点,它不是确定的位置.
因此,尽管hash(4)返回4,但底层C结构中的确切“位置”也基于其他键已存在的位置以及当前表的大小.例如,根据需要(添加项目)调整python哈希表的大小.
由于dict没有排序,这不是你需要担心或者希望影响的东西.如果您需要在dict中进行排序,请使用collections.OrderedDict()实现,它将分别跟踪排序.
python哈希表实现的细节
您可能想要了解哈希表在Wikipedia上的工作方式; Python使用开放寻址来实现它.
当在表中选择时隙时,采用散列值(整数)和当前表大小的模数,因此在大小为32的表上,因此密钥45,散列值45最初将存储在时隙14中.
如果存在冲突(插槽14中已经存在其他东西并且它不是整数45),则插槽值被扰动,直到找到空槽或找到相同的键.扰动是用公式完成的:
perturb = slot = hash
while slot_is_full and item_in_slot_is_not_equal_to_key:
slot = (5*slot) + 1 + perturb
perturb >>= 5
因此,当发生碰撞时,以逐渐变小的步骤拾取另一个槽,直到它扫描整个表.请注意,如果需要,表格已经调整大小以腾出空间.
为了使其正常工作,自定义类型需要__hash__()方法,并且需要实现__eq__()以确定两个实例是否表示相同的密钥.匹配哈希值是不够的.对于dict实现,要考虑两个实例来表示完全相同的键,它们的哈希值必须匹配,并且它们必须为==相等运算符返回True.这些对象被认为是hashable.
(对于Python 2.x,实现__cmp__() hook而不是实现__eq __();在Python 3中已经删除了对此的支持.