多数のオブジェクト (オブジェクトのバイト配列に格納された値の一意の組み合わせ) をハッシュマップ (約 280 万オブジェクト) に格納しています。また、ハッシュ コード (32 ビット ハッシュ)、統計的には、少なくとも 1 つの衝突が発生する可能性がほぼ 100% あるのに、まったくないことに非常に驚いています ( http://preshing.com/20110504/hash-collision-probabilities/を参照)。
したがって、衝突を検出するための私のアプローチにバグがあるのか 、それとも非常に幸運なのか疑問に思っています...
マップに格納されている 280 万の値から衝突を検出する方法を次に示します。
HashMap<ShowdownFreqKeysVO, Double> values;
(...fill with 2.8 mlns unique values...)
HashSet<Integer> hashes = new HashSet<>();
for (ShowdownFreqKeysVO key:values.keySet()){
if (hashes.contains(key.hashCode())) throw new RuntimeException("Duplicate hash for:"+key);
hashes.add(key.hashCode());
}
そして、ハッシュ値を作成するためのオブジェクトのアプローチは次のとおりです。
public class ShowdownFreqKeysVO {
//Values for the different parameters
public byte[] values = new byte[12];
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(values);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ShowdownFreqKeysVO other = (ShowdownFreqKeysVO) obj;
if (!Arrays.equals(values, other.values))
return false;
return true;
}
}
私が間違っていることについてのアイデア/ヒントは大歓迎です!
ありがとう、トーマス