哈希函数冲突过多

时间:2018-10-20 18:49:58

标签: java hash hashtable hashcode

我正在尝试使用多项式累加方法创建哈希函数(应该为您每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);
    }

3 个答案:

答案 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是一个不错的选择。