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]