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)
所以,如果我这样做,哈希码()的均匀分布是否会改变?我的意思是从两个不同的对象获得相同值的概率会增加与否?
它Object.hash()有一个非常简单的 hashCode,对于简单的例子来说并不是特别统一。例如,Objects.hash("B", "B") 和Objects.hash("A", "a") 具有相同的hashCode。(顺便说一句,很简单,我可以在脑海中解决这个问题)
此外,每个 和 之间的Objects.hashCode("a", "a")值 Objects.hashCode("z", "z")都在 4065 和 4865 之间,看起来不是特别均匀,尤其是对于较高位。
在这种情况下,我想你可以说你没有让事情变得更糟。
| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |