V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rqxiao
V2EX  ›  Java

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

  •  
  •   rqxiao · 2020-11-03 14:12:52 +08:00 · 2125 次点击
    这是一个创建于 1480 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    3 条回复    2020-11-03 15:08:42 +08:00
    kerb15
        1
    kerb15  
       2020-11-03 14:48:03 +08:00   ❤️ 1
    扰动函数,将高位和地位做异或,主要是为了让所有二进制位都能进来参与运算,增加随机性,使得散列的效果更好
    SoloCompany
        2
    SoloCompany  
       2020-11-03 14:55:56 +08:00   ❤️ 1
    因为桶的数量通常不会超过 65536, 异或一下减少高位信息熵的浪费
    AllanAG
        3
    AllanAG  
       2020-11-03 15:08:42 +08:00   ❤️ 1
    在这个方法中将 key 的 hashcode 右移 16 位,然后按位异或。异或算法是相同为 0,不同为 1 。
    右移 16 位以后,原来的高 16 位就到了低 16 位上,再与原来的数异或,就相当于高 16 位与低 16 位异或。
    因此 hash 算法的作用就是高 16 位不变,低 16 位和高 16 位做异或。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:06 · PVG 19:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.