在内部,哈希如何查找密钥以获取值?

时间:2010-12-06 20:56:07

标签: c# dictionary hash

在内部,哈希如何查找密钥以获取值?

它会是bin sort吗?

2 个答案:

答案 0 :(得分:6)

字典使用哈希码来计算存储条目的存储桶的编号。桶的数量被选择为素数,并且特定密钥的桶号被计算为以桶的数量为模的密钥的哈希码。因为多个对象可以具有相同的哈希码,并且多个哈希码可以位于同一个桶中,所以当在桶中找到密钥时,还必须对其进行比较以确保它是正确的密钥。如果在存储桶中找到错误的密钥,则错误条目的next成员将用于查找搜索所需密钥的下一个位置。

该算法的结果是,当没有冲突时,可以非常快速地找到正确的桶 - O(1),但在最坏的情况下,它可以在字典中存储的条目数量中花费线性时间。我在这里假设对象的哈希码可以在恒定时间内计算。

通过下载参考实现源或使用.NET Reflector可以看到.NET实现中的实际代码:

private int FindEntry(TKey key)
{
    if (key == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
    }
    if (this.buckets != null)
    {
        int num = this.comparer.GetHashCode(key) & 0x7fffffff;
        for (int i = this.buckets[num % this.buckets.Length]; i >= 0; i = this.entries[i].next)
        {
            if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
            {
                return i;
            }
        }
    }
    return -1;
}

答案 1 :(得分:0)

哈希只是一种针对密钥运行的算法,该密钥创建(希望)一个唯一值,指向存储项目的存储桶。因此,当您计算值以尝试检索该项目时,您希望是哈希将指向您之前保存的对象。如果没有,则应该有一个指针,指示在哪里查找共享此哈希值的下一个对象。当您找到您的物品时,它将返回。如果到达链的末尾,则无法找到您的商品。

有关散列的更全面定义,请参阅Hash TablesHash Function