【发布时间】:2012-02-28 08:05:37
【问题描述】:
我正在尝试了解 Hashtables 在 C# 中的工作原理。我阅读了 MSDN 文章,了解到 C# Hashtables 使用“重新散列”处理冲突,即如果我尝试将键/值对插入到哈希表中,如果使用 HashFunction H1 导致冲突,那么它将尝试 HashFunction H2、H3等,直到没有发现碰撞。
MSDN报价:
Hashtable 类使用一种不同的技术,称为 重演。 (一些来源将重新散列称为双重散列。)
重新散列的工作原理如下:有一组不同的散列 函数,H1 ... Hn,以及在从 哈希表,最初使用 H1 哈希函数。如果这导致 如果发生碰撞,则尝试使用 H2,并在需要时尝试直至 Hn。 上一节只展示了一个哈希函数,即 初始哈希函数(H1)。其他哈希函数非常相似 到这个函数,只用一个乘法因子来区分。在 一般来说,散列函数Hk定义为:
Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize
但是,以 MSDN 站点 1 为例:
private static Hashtable employees = new Hashtable();
public static void Main()
{
// Add some values to the Hashtable, indexed by a string key
employees.Add("111-22-3333", "Scott");
employees.Add("222-33-4444", "Sam");
}
假设添加第二个键会导致冲突,因此必须使用 H2。但是,当我调用 employees["222-33-4444"] 时,哈希表是如何知道使用 H2 的?有单独的映射吗?谢谢。
【问题讨论】:
-
如果你引用一个链接,你应该包括它。