jbm3072 发表于 2013-2-3 13:18:32

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的效率。
页: [1]
查看完整版本: Java hashMap的 Hash函数