【发布时间】:2011-09-28 16:03:31
【问题描述】:
我被告知.NET 中的Hashtable 使用重新散列来减少/避免冲突。
即。 “重新哈希的工作方式如下:假设我们有一组不同的哈希函数,H1 ... Hn,并且在从哈希表中插入或检索项目时,最初使用 H1 哈希函数。如果这导致冲突,则尝试 H2 并向前直到 Hn 以避免 Hashtable 中的冲突。”
假设:我们有一个包含 n(其中 n 1)时实现了这一点。
问题: 当我们寻找(检索)任何元素(如果使用不同的散列函数)时,有人可以解释一下 CLR 如何将 Key 映射到散列码? CLR 如何跟踪(如果有)任何活动对象(哈希表)的哈希函数?
提前致谢
【问题讨论】:
-
侧边栏:由于使用 .NET 1.1(直接或通过库),您是否需要使用
Hashtable?如果没有,你应该考虑System.Collections.Generic.Dictionary<TKey, TValue>。 -
@Anthony Pegram :我相信在哈希表数据结构优化方面不应该有(?!)任何差异,我的意思是 Hashtable 和 Dictionary 类的低级实现。 AFAIK 的主要区别在于 Dictionary 提供了泛型类型参数,通过有效地排除装箱/拆箱操作,可以更有效地处理值类型对象
-
我看了
Dictionary<TKey, TValue>的代码,所以知道它没有使用多个hash函数,只是单个hash函数object.GetHashCode(),按照表格的模数放在一个槽中大小(这是一个素数)。 -
@Anthony Pegram:我们有一个使用 Hashtable 的代码库。因此,关键是要知道哈希表是如何秘密工作的。无论如何感谢您的评论。
-
@sll:感谢您对通用哈希的闪现想法。尽管如此,我必须在这里评论你的观点。 AFAIK Hashtable 在发生冲突时使用重新散列/双散列。但是当涉及到 Dictionary 时,它使用链接来避免冲突。我现在能想到的唯一相似之处是 Dictionary 是 Hashtable 的通用实现。
标签: c# hashtable universal-hashing