哈希码计算

时间:2016-09-26 17:29:21

标签: java hashmap hashtable hashcode

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

我没有得到这条线,任何人都可以帮助我。

感谢。

2 个答案:

答案 0 :(得分:1)

这个建议是基于多个字段计算哈希码。它基于这样的观察:在0和32之间乘以2的幂相当于将数字左移相应的位数,因此"归零"数字的右侧。

考虑一种情况,当您需要构造十个字段的哈希码,并将各个字段的哈希码乘以32时。这相当于将哈希码向左移动五位。如果这样做,结束哈希码将不依赖于前三个字段的哈希码,因为它们的哈希码的值将从结果哈希码中移出。

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

答案 1 :(得分:1)

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

这样做的原因是hashcode用于进行粗略的排序"价值进入"桶"基于哈希码的值。这允许像哈希表这样的结构只在桶中搜索特定值,而不是搜索表中的每个元素。

问题是,有超过40亿个可能的哈希码,但你通常会有更少的桶来放入值。

想象一下你正在散列10个桶的场景。 Hashcodes 0-9可以全部进入单独的桶中,​​但是10需要进入与0相同的桶,11与1相同,依此类推。如果您有1,145,42,5830这样的哈希码,那么一切都运行良好,因为每个值都可以放入不同的桶中。另一方面,如1,131,593021,63421这样的值,它们都会进入相同的桶,因为它们以相同的数字结束,而我们所看到的只是因为我们只有10个桶。因此,它只会改变我们的哈希码的最不重要的部分,这对我们来说真的很重要。