哈希码的均匀分布()

nd0*_*d07 5 java hashcode hash-collision

我把我的课定义为:

final class Key<T extends Comparable<T>> {
    private final T q;
    private final T o;
    public Key(T q1, T o1) {
        q = q1;
        o = o1;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof Key) {
            Key<T> s = (Key<T>)obj;
            return q.equals(s.q) && o.equals(s.o);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(q,o);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还定义了一个包含对象键的数组.例如:

Object arr[] = new Object[100];
Key<String> k = new Key<>("a","b");
int h = k.hashcode();
...
arr[h+i % h] = k; //i from 1 to 10 for example
Run Code Online (Sandbox Code Playgroud)

问题是hashcode()可以返回负值

arr[h+i % h] = k;
Run Code Online (Sandbox Code Playgroud)

可以从数组索引中返回错误.这就是为什么我改变我的代码(基于我的搜索避免hashcode()返回负值):

@Override
        public int hashCode() {
            return (Objects.hash(q,o)&0x7FFFFFFF);
        }
Run Code Online (Sandbox Code Playgroud)

所以,如果我这样做,哈希码()的均匀分布是否会改变?我的意思是从两个不同的对象获得相同值的概率会增加与否?

Pet*_*rey 2

Object.hash()有一个非常简单的 hashCode,对于简单的例子来说并不是特别统一。例如,Objects.hash("B", "B") 和Objects.hash("A", "a") 具有相同的hashCode。(顺便说一句,很简单,我可以在脑海中解决这个问题)

此外,每个 和 之间的Objects.hashCode("a", "a")Objects.hashCode("z", "z")都在 4065 和 4865 之间,看起来不是特别均匀,尤其是对于较高位。

在这种情况下,我想你可以说你没有让事情变得更糟。