Ex39很难学习Python,很难理解它的代码

时间:2015-12-07 00:00:10

标签: python hash

我很难理解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)]

1 个答案:

答案 0 :(得分:0)

Modulo用于将数字约束到范围。这是一个众所周知的技巧。这样,如果你溢出你"发送"数字回到了范围。

假设我想要[0,9]中的数字并且我有一个哈希生成器而不是生成[0,100]范围内的数字。如果我使用hash % 10,则保证在我的预期范围内。在第一段代码中,该技巧用于将项目与桶匹配,因为哈希不一定受限但是桶是。

第二段代码只使用约束散列(在桶范围内)获取存储桶。要理解它,您必须了解大多数时候哈希映射都适用于存储桶。 良好哈希映射会在桶中平均分配(或接近它)。

因此,如果我们重新迭代 - 如果您在[0,100]和10个桶[0,10]中有哈希值,则可以使用hash % 10计算每个项目的桶索引。这会将每个项目的哈希值与所需范围[0,10]中的桶匹配。