python 字典覆盖函数_在字典中覆盖Python的哈希函数

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中已经删除了对此的支持.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值