【问题标题】:Hash Code Calculation哈希码计算
【发布时间】:2017-02-04 03:45:20
【问题描述】:

我刚好在过哈希码的概念,遇到了一行multiplying by primes will not tend to shift information away from lower end - as would multiplying by a power of 2

我没有得到这条线,谁能帮我解决这个问题。

谢谢。

【问题讨论】:

  • 乘以 2 的 n 次方与左移n 位的结果相同。结果的低位n 在任何情况下都为0,因此它们不包含有关原始值的信息。乘以一个素数仍然会丢失一些信息,但是这种信息丢失会分散在更多的位上,并且没有一个结果是没有任何信息内容的。

标签: java hashmap hashtable hashcode


【解决方案1】:

此建议适用于基于多个字段计算哈希码。它基于以下观察:在 0 到 32 之间乘以 2 的幂相当于将数字左移相应的位数,从而将数字的右侧“清零”。

假设您需要构造一个包含十个字段的哈希码,然后将各个字段的哈希码乘以 32。这相当于将哈希码向左移动了 5 位。如果你这样做,结束哈希码将不依赖于前三个字段的哈希码,因为它们的哈希码的值将被移出结果哈希码。

这种行为是不可取的,因为最后七个字段相同的项目将具有相同的哈希码,即使前三个字段可能不同。这很糟糕,因为它增加了哈希冲突的可能性。相反,如果乘以大于 2 的素数,则每个字段的哈希值的一些信息会影响最终结果,从而产生更好的哈希函数。

【讨论】:

    【解决方案2】:

    在哈希码的许多用途中,只有哈希码最不重要的部分发生变化才重要。换句话说,3 和 5 之间的差异很重要,但 3000 和 5000 也可能是同一个数字。

    这样做的原因是哈希码用于根据哈希码的值对值进行粗略的“排序”到“桶”中。这允许像哈希表这样的结构仅在存储桶中搜索特定值,而不是搜索表中的每个元素。

    问题是,有超过 40 亿个可能的哈希码,但通常可以将值放入的存储桶数量要少得多。

    想象一个场景,您正在散列到 10 个桶中。哈希码 0-9 都可以进入不同的桶,但是 10 需要和 0 进入同一个桶,11 需要和 1 进入同一个桶,以此类推。如果您有像 1、145、42、5830 这样的哈希码,那么一切都运行良好,因为这些值中的每一个都可以放入不同的存储桶中。另一方面,对于像 1 ,131, 593021, 63421 这样的值,它们都将进入同一个存储桶,因为它们以相同的数字结尾,这就是我们正在查看的所有内容,因为我们只有 10 个存储桶。所以它只会改变对我们真正重要的哈希码中最不重要的部分。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 2017-02-20
      • 2012-04-14
      • 2014-01-14
      • 1970-01-01
      • 2017-03-06
      • 2017-03-01
      • 2017-12-26
      相关资源
      最近更新 更多