Hashmap的扰动函数

2019-11-14  本文已影响0人  何奔奔

java的Hashmap里的hash方法里用到了扰动函数,我更喜欢称之为扰动计算。目的是为了减少hash冲突。

思路是保留高位和低位特征

Jdk7中的源码

h ^=(h >>> 20)^(h >>> 12);
return h ^(h >>> 7)^(h >>> 4);

这两行代码里用了四次>>>运算,因为>>>就是把低位去掉保留高位。然后高位和低位进行^位运算。这样不管是高位发生变化,还是低位发生变化都会造成其结果的中低位发生变化。

为什么我们关注其结果的中低位呢,那是因为后面算index的时候,用了h & (length-1),它的意思就是把高位去掉。
如果没有进行扰动计算,当key仅仅发生高位变动的时候就会发生hash冲突,这对Hashmap来说往往是致命的

Jdk8中对扰动计算做了简化,但其思路还是一样的,可能还有个原因,jdk8引入和红黑树,就算hash冲突稍微多点性能也还不错。

 (key == null)? 0 :(h = key.hashCode())^(h >>> 16);

上一篇下一篇

猜你喜欢

热点阅读