我正在尝试使用多项式累加方法创建哈希函数(应该为您每55k个单词5次碰撞),但是当我用1,000个单词运行它时,我会遇到约190次碰撞。我在做错什么吗?
public int hashCode(String str) {
double hash_value = 0; // used for float
for (int i = 0; i < str.length(); i++){
hash_value = 33*hash_value + str.charAt(i);
}
return (int) (hash_value % array_size);
}
答案 0 :(得分:1)
通常,素数是哈希码生成的首选。我建议尝试109或251。33是3的倍数,这意味着您根据输入的内容更有可能出现问题。
此外,您应该使用int进行计算,并对结果调用Math.abs。
答案 1 :(得分:0)
要么您的数据集非常“不幸”,要么(更可能是)array_size
太小(通常在不考虑有限存储区数组大小的情况下引用哈希函数参数)。
答案 2 :(得分:0)
您正在生成大量的数字,该数字对于输入中的不同单词是不同的。但是仍然有可能发生碰撞,例如
"bA" = 98+(33x65)=2243
"AB" = 65+(33x66)=2243
如果您选择大于57的较大数,则发生碰撞的机会会更少。 109或251是一个不错的选择。