2つ以上の整数を持つオブジェクトの衝突を最小限に抑えながら、一般的な(そしてパフォーマンスの高い)方法でハッシュコードを実装するにはどうすればよいですか?
更新:多くの人が述べているように、もちろん衝突を完全に排除することはできません(正直なところ、それについては考えていませんでした)。したがって、私の質問は、それを反映するように編集して、適切な方法で衝突を最小限に抑える方法です。
NetBeans の自動生成を使用すると失敗します。例えば:
public class HashCodeTest {
@Test
public void testHashCode() {
int loopCount = 0;
HashSet<Integer> hashSet = new HashSet<Integer>();
for (int outer = 0; outer < 18; outer++) {
for (int inner = 0; inner < 2; inner++) {
loopCount++;
hashSet.add(new SimpleClass(inner, outer).hashCode());
}
}
org.junit.Assert.assertEquals(loopCount, hashSet.size());
}
private class SimpleClass {
int int1;
int int2;
public SimpleClass(int int1, int int2) {
this.int1 = int1;
this.int2 = int2;
}
@Override
public int hashCode() {
int hash = 5;
hash = 17 * hash + this.int1;
hash = 17 * hash + this.int2;
return hash;
}
}
}