我在哈希映射(〜280萬個對象)中存儲了大量對象(在對象中存儲在字節數組中的唯一數值組合),並且在檢查是否有任何碰撞哈希碼(32位哈希),我非常驚訝地發現在統計上沒有,我幾乎有100%的機會至少有一次碰撞(參見http://preshing.com/20110504/hash-collision-probabilities/)。Java哈希衝突概率
我是這樣想,如果我的方法來檢測碰撞被竊聽或者如果我非常幸運......
這裏是我嘗試從存儲在地圖的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;
}
}
任何想法/提示將不勝感激!
感謝, 托馬斯
'hashes'在這一行之後包含了什麼'HashSet hashes = new HashSet <>();'?你如何爲'哈希'填充值? –
他在循環中用'hashes.add(key.hashCode());'添加它們。 – meriton
如果在執行'result = prime * result + ...'之前將素數和結果設置爲常數,那麼在那裏看起來錯了。 – mprivat