在内部,哈希如何查找密钥以获取值?
它会是bin sort吗?
答案 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 Tables和Hash Function。