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

Nas*_*ova 8 .net c# hashtable collision

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

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

或者还有其他一些策略?

Pre*_*gha 15

本文在MSDN上对此进行了描述:使用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
Run Code Online (Sandbox Code Playgroud)

Dictionary类与Hashtable类的区别在于多种方式.除了强类型之外,Dictionary还使用与Hashtable类不同的冲突解决策略,使用称为链接的技术.回想一下,通过探测,在发生碰撞时,尝试了桶列表中的另一个槽.(通过重新散列,重新计算散列,并尝试使用新的插槽.)但是,通过链接,可以使用辅助数据结构来保存任何冲突.具体来说,Dictionary中的每个插槽都有一个映射到该存储桶的元素数组.如果发生碰撞,碰撞元素将被添加到桶的列表中.

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


the*_*oop 5

这实际上是一个非常有趣的问题; 我刚刚写了一篇关于如何Dictionary在幕后实现的博客文章.我可能会Hashtable在稍后的内容中介绍.