Java 哈希函数冲突太多

Java 哈希函数冲突太多,java,hash,hashtable,hashcode,Java,Hash,Hashtable,Hashcode,我试图使用多项式累加方法(假设每55k个单词或类似的东西会产生5次冲突)生成一个散列函数,但是当我用1000个单词运行它时,会产生约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_va

我试图使用多项式累加方法(假设每55k个单词或类似的东西会产生5次冲突)生成一个散列函数,但是当我用1000个单词运行它时,会产生约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);
    }
public int hashCode(String str){
双哈希_值=0;//用于浮点
对于(int i=0;i
要么您的数据集非常“不走运”,要么(更可能)数组大小太小(哈希函数参数的引用通常不考虑有限的bucket数组大小)。

通常,生成哈希代码时会使用素数。我建议试试109或251。33是3的倍数,这意味着根据您的输入,您更有可能出现问题


此外,您还应使用int进行计算,并对结果调用Math.abs。

您正在生成一个大数字,该数字对于输入中的不同单词是不同的。但是,例如,仍然存在碰撞的可能性

"bA" = 98+(33x65)=2243
"AB" = 65+(33x66)=2243

如果你选择一个大于57的大数字,那么碰撞的可能性就会降低。109或251将是一个不错的选择。

“并在结果上调用Math.abs”为什么?hashCode不必返回非负数。@AndyTurner true,但是从
%array\u size
中,我假设这将用作数组的索引。除了使用double和33之外,这与内置字符串哈希方法基本相同。你为什么不能用这个?