V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
rqxiao
V2EX  ›  Java

1.8 Hashmap 里的 hash 方法是什么意思呢

  •  
  •   rqxiao · Nov 3, 2020 · 2641 views
    This topic created in 2009 days ago, the information mentioned may be changed or developed.

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

    网上说是让这个 key 可以更加分散?

    让原本的 hashcode 和 原本 hashcode 无符号右移 16 位 进行一次异或

    3 replies    2020-11-03 15:08:42 +08:00
    ex1gtnim7d
        1
    ex1gtnim7d  
       Nov 3, 2020   ❤️ 1
    扰动函数,将高位和地位做异或,主要是为了让所有二进制位都能进来参与运算,增加随机性,使得散列的效果更好
    SoloCompany
        2
    SoloCompany  
       Nov 3, 2020   ❤️ 1
    因为桶的数量通常不会超过 65536, 异或一下减少高位信息熵的浪费
    AllanAG
        3
    AllanAG  
       Nov 3, 2020   ❤️ 1
    在这个方法中将 key 的 hashcode 右移 16 位,然后按位异或。异或算法是相同为 0,不同为 1 。
    右移 16 位以后,原来的高 16 位就到了低 16 位上,再与原来的数异或,就相当于高 16 位与低 16 位异或。
    因此 hash 算法的作用就是高 16 位不变,低 16 位和高 16 位做异或。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   760 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 21:16 · PVG 05:16 · LAX 14:16 · JFK 17:16
    ♥ Do have faith in what you're doing.