我在哈希映射(〜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