关于hashmap:Python的字典映射使用哪种哈希算法?

What hash algorithm does Python's dictionary mapping use?

我正在搞一个命令行解析器,想知道python dict使用哪种哈希算法?

我的设置方法是,有一个模式匹配算法,该算法将带标记的输入序列与字典键进行匹配。 一些键相对较长(6到7个字符串的长度为5或6个元组)。 我想知道是否存在长字典键会大大降低键检索效率的问题。


它使用的哈希取决于用作键的对象-每个类都可以定义自己的__hash __()方法,并且它为特定实例返回的值是用于字典的值。

Python本身为str和tuple类型提供了哈希实现。 快速查看源代码,应该可以找到针对这些源代码的确切算法。

元组的哈希值基于其内容的哈希值。 该算法本质上是这样(略有简化):

1
2
3
4
5
6
7
def hash(tuple):
    mult = 1000003
    x = 0x345678
    for index, item in enumerate(tuple):
        x = ((x ^ hash(item)) * mult) & (1<<32)
        mult += (82520 + (len(tuple)-index)*2)
    return x + 97531

对于字符串,解释器还会遍历每个字符,并将它们与此(再次略微简化)的算法结合起来:

1
2
3
4
5
def hash(string):
    x = string[0] << 7
    for chr in string[1:]:
        x = ((1000003 * x) ^ chr) & (1<<32)
    return x

更大的问题是要避免散列冲突。 碰撞的哈希键将导致线性搜索,因为字典会尝试查找存储新对象的位置(这已被视为安全问题,并且在即将发布的python版本中行为可能会发生变化)