【问题标题】:Hashtable- RehashingHashtable - 重新散列
【发布时间】: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


【解决方案1】:

哈希函数的随机选择被称为Universal Hashing 方法。 AFAIK 哈希函数在某些初始化过程中选择一次,因此当在单个哈希表的范围内使用多个哈希函数时,这不是真实的情况。

编辑:更多详情

刚回到家,打开 T. Cormen 的“算法简介”一书,在11.3.3 Universal Hashing部分找到以下内容:

通用哈希背后的主要思想是选择哈希函数 从精心设计的一类函数中随机抽取 开始执行

您可以通过在 Google 图书网站here预览该书阅读更多内容

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2014-05-21
    • 1970-01-01
    • 2021-08-18
    • 2016-11-12
    • 2011-07-03
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多