Python如何存储dict键,在哈希表中发生冲突时的值?什么是用于获取哈希值的哈希算法?
答案 0 :(得分:11)
对于“普通”Python,Praveen Gollakota的this great writeup解释得非常好,这里有重要的内容:
O(1)
查找)。 <hash, key, value>
。这是作为C结构实现的(参见dictobject.h:51-56)。i
开始。 CPython使用初始i = hash(key) & mask
,其中mask = PyDictMINSIZE - 1
,但这并不重要。请注意,检查的初始插槽i
取决于密钥的哈希值。<hash|key|value>
)。但如果那个插槽被占用怎么办?很可能是因为另一个条目具有相同的哈希值(哈希冲突!)i+1
,i+2
,...并使用第一个可用的(线性探测)。但由于评论中详细解释的原因(见dictobject.c:33-126),CPython使用随机探测。在随机探测中,以伪随机顺序拾取下一个时隙。该条目将添加到第一个空槽中。对于此讨论,用于选择下一个时隙的实际算法并不重要(有关探测算法,请参阅dictobject.c:33-126)。重要的是探测插槽直到找到第一个空插槽。i
开始(其中i
取决于密钥的散列)。如果散列和密钥都与插槽中的条目不匹配,则它开始探测,直到找到具有匹配的插槽。如果所有插槽都耗尽,则报告失败。答案 1 :(得分:0)
简短版本:Python规范没有指定字典实现,但CPython使用哈希映射并处理与开放寻址的冲突。
请参阅this answer to a similar question以及Wikipedia page on hash tables。