public int getHashValue(K key){
return (key.hashCode() & 0x7fffffff) % size;
}
Run Code Online (Sandbox Code Playgroud)
我不明白什么是0x7fffffff的意思.有没有其他方法来编写getHasValue方法?
常量0x7FFFFFFF
是一个十六进制的32位整数,除了最高位之外都有.
尽管有这个名字,但这个方法并没有得到hashCode,而是寻找密钥应该出现在哈希集或映射中的哪个桶.
当您使用%
负值时,您将获得负值.没有负面桶,所以为了避免这种情况,你可以删除符号位(最高位),这样做的一种方法是使用掩码,例如x & 0x7FFFFFFF
保留除顶部位之外的所有位.另一种方法是移动输出,x >>> 1
但速度较慢.
稍微好一点的方法是使用"取模数并应用Math.abs".这使用了hashCode的所有位,这可能更好.
例如
public int getBucket(K key) {
return Math.abs(key.hashCode() % size);
}
Run Code Online (Sandbox Code Playgroud)
即使这是不理想的,因为一些hashCode()具有较差的分布,导致较高的冲突率.你可能想在模数之前搅拌哈希码等.
public int getBucket(K key) {
return Math.abs(hash(key) % size);
}
Run Code Online (Sandbox Code Playgroud)
java 8中的HashMap使用它
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Run Code Online (Sandbox Code Playgroud)
该功能很简单,因为它可以有效地处理冲突.在Java 7中,它使用了这个功能.
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);
}
Run Code Online (Sandbox Code Playgroud)