Java hashMap的 Hash函数

在教科书提到的Hash函数就是求模了。Java的hash函数是怎样的呢?先看代码:

 /**
     * Applies a supplemental hash function to a given hashCode, which
     * defends against poor quality hash functions.  This is critical
     * because HashMap uses power-of-two length hash tables, that
     * otherwise encounter collisions for hashCodes that do not differ
     * in lower bits. Note: Null keys always map to hash 0, thus index 0.
     */
static int hash(int h) {
        // 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);
    }

    /**
     * Returns index for hash code h.
     */
  static int indexFor(int h, int length) {
        return h & (length-1);
 }

 hash对一个对象的hashCode进行重新计算,而IndexFor生成这个对象的index。

hash值重新计算,是为了防止质量低下的hashCode()函数实现。在hashMap数组长度中长度是初始长度的2倍。通过右移造成地位的数据尽量的不同。

 

而 在计算index上使用的是h&(length-1)的方法。简单而效率高。

 

看了Java的代码,自己在设计hash函数的时候,就有选择了。尽量使用位运算符,少使用+-*/%的运算符,这样可以提高hash的效率。

你可能感兴趣的:(java,算法,HashMap,hash)