我很难理解Learn Python The Hard Way Ex39中的很多代码。
我的第一个困惑是关于作者为什么在这里使用模块划分hash(key) % len(aMap)
。它返回什么价值?为什么作者需要提醒?
def hash_key(aMap, key):
"""Given a key this will create a number and then convert it to an index for the aMap's buckets."""
return hash(key) % len(aMap)
对我来说第二个令人困惑的事情是下一个代码
def get_bucket(aMap, key):
"""Given a key, find the bucket where it would go."""
bucket_id = hash_key(aMap, key)
return aMap[bucket_id]
据我了解,bucket_id
应该等于hash(key) % len(aMap)
的价值,那么为什么我们不返回aMap[hash(key)]
?
答案 0 :(得分:0)
Modulo用于将数字约束到范围。这是一个众所周知的技巧。这样,如果你溢出你"发送"数字回到了范围。
假设我想要[0,9]中的数字并且我有一个哈希生成器而不是生成[0,100]范围内的数字。如果我使用hash % 10
,则保证在我的预期范围内。在第一段代码中,该技巧用于将项目与桶匹配,因为哈希不一定受限但是桶是。
第二段代码只使用约束散列(在桶范围内)获取存储桶。要理解它,您必须了解大多数时候哈希映射都适用于存储桶。 良好哈希映射会在桶中平均分配(或接近它)。
因此,如果我们重新迭代 - 如果您在[0,100]和10个桶[0,10]中有哈希值,则可以使用hash % 10
计算每个项目的桶索引。这会将每个项目的哈希值与所需范围[0,10]中的桶匹配。