在.net中为HashTable / Dictionary实现选择了什么类型的冲突解决方案?

时间:2011-09-16 12:37:33

标签: c# .net hashtable collision

我们知道有两种经典的冲突解决策略:分离链接和开放寻址。

我想知道在.net中为HashTable / Dictionary选择了哪一个。

还是使用过其他策略?

2 个答案:

答案 0 :(得分:15)

本文在MSDN上对此进行了描述:An Extensive Examination of Data Structures Using C# 2.0

  

...称为rehasing的冲突解决技术,即   .NET Framework的Hashtable类使用的技术。在决赛中   我们将看一下使用碰撞的Dictionary类   分辨率技术称为链接。   ....

     

... Rehasing的工作原理如下:有一组哈希不同   函数,H1 ... Hn,以及从中插入或检索项目时   哈希表,最初使用H1哈希函数。如果这导致   碰撞时,H2会被尝试,如果需要,可以直到Hn。   上一节只显示了一个哈希函数,即   初始哈希函数(H1)。其他哈希函数非常相似   对于此功能,仅通过乘法因子进行区分。在   一般来说,哈希函数Hk定义为:

 Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) %  (hashsize – 1)))] % hashsize
  

Dictionary类在更多方面与Hashtable类不同   不止一个。除了强类型之外,字典也是如此   采用与Hashtable不同的冲突解决策略   类,使用称为链接的技术。回想一下   探测,如果发生碰撞,列表中的另一个插槽   水桶尝试。 (通过重新散列,重新计算哈希值,然后重新计算   尝试使用新的插槽。)然而,使用链接,辅助数据结构   用于保持任何碰撞。具体来说,每个插槽都在   Dictionary具有映射到该存储桶的元素数组。在里面   碰撞事件,碰撞元素被预先附加到   桶的清单。

请记住,只有第一句话是我自己的: - )

答案 1 :(得分:5)

这实际上是一个非常有趣的问题;我刚刚在Dictionary幕后实现了Hashtable。我可以在稍后的内容中介绍{{1}}。