它使用的哈希取决于用作键的对象 – 每个类都可以定义自己的__hash __()方法,并且它为特定实例返回的值是字典使用的值.
Python本身为str和元组类型提供了哈希实现.来源的快速查看应该揭示那些准确的算法.
元组的散列是基于其内容的散列.算法基本上是这个(稍微简化):
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
对于字符串,解释器还对每个字符进行迭代,并将其与此(再次简单的)算法相结合:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x) ^ chr) & (1<<32)
return x
一个更大的问题是要避免哈希冲突.碰撞散列键将导致线性搜索,因为字典尝试找到一个存储新对象的位置(现在被认为是一个安全问题,并且此行为可能会在即将到来的python版本中更改)