美文网首页
Hashmap的扰动函数

Hashmap的扰动函数

作者: 何奔奔 | 来源:发表于2019-11-14 16:43 被阅读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);

    相关文章

      网友评论

          本文标题:Hashmap的扰动函数

          本文链接:https://www.haomeiwen.com/subject/qjirictx.html