我不明白什么是0x7fffffff的意思.有没有其他方法来编写getHashValue方法?

b.a*_*lex 2 java hash

public int getHashValue(K key){
    return (key.hashCode() & 0x7fffffff) % size;
}
Run Code Online (Sandbox Code Playgroud)

我不明白什么是0x7fffffff的意思.有没有其他方法来编写getHasValue方法?

Pet*_*rey 9

常量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)


moo*_*oga 2

这是 Max 的十六进制表示。整数

你可以在这里查看