Java HashMap 哈希函数

Lav*_*Lav 0 java collections hash hashmap

我正在通过 Java 的 HashMap hash() 实现,如下所示

final int hash(Object k) {
            // some checks
            h ^= k.hashCode();
            // This function ensures that hashCodes that differ only by
            // constant multiples at each bit position have a bounded
            // number of collisions (approximately 8 at default load factor).
            h ^= (h >>> 20) ^ (h >>> 12);
            return h ^ (h >>> 7) ^ (h >>> 4);
                   // >>> is Unsigned right shift
    }
Run Code Online (Sandbox Code Playgroud)

我不确定为什么添加下面的代码,以及相同的好处是什么?

        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
Run Code Online (Sandbox Code Playgroud)

或者让我重新定义我的问题,如果我从实现中删除上面的代码有什么缺点?我了解它是如何避免碰撞机会的,但不确定“确切地”如何?

有人可以通过举个例子来帮助我理解,并解释使用和不使用上述代码将如何工作吗?

Lou*_*man 5

Java 哈希表实现不是将表的大小调整为素数,而是调整为 2 的幂。这允许它使用快速位掩码而不是昂贵的余数操作,这通常是一件好事,但缺点是特别糟糕的哈希函数可能比平时有更多的冲突。您引用的代码以最小化额外冲突的方式混合了散列的位。