Java:需要关于散列函数溢出的帮助吗

Java:需要关于散列函数溢出的帮助吗,java,hash,hashtable,integer-hashing,Java,Hash,Hashtable,Integer Hashing,我正在做一个作业,我必须将10000个数字散列到一个加载大小为1、.2.3的散列表中。。。。高达0.9。我的问题是,我的哈希函数给了我一些溢出或类似的东西。如果我对一个加载因子为.5的表进行哈希运算,比如36077(mod)20000,它会给我16070作为键。这仅发生在高于负载系数的数字上。这是我的哈希函数的代码 public int linearHash(int in){ int hashKey = in%hashTableArray.length; while(th

我正在做一个作业,我必须将10000个数字散列到一个加载大小为1、.2.3的散列表中。。。。高达0.9。我的问题是,我的哈希函数给了我一些溢出或类似的东西。如果我对一个加载因子为.5的表进行哈希运算,比如36077(mod)20000,它会给我16070作为键。这仅发生在高于负载系数的数字上。这是我的哈希函数的代码

    public int linearHash(int in){
    int hashKey = in%hashTableArray.length;
    while(this.hashTableArray[hashKey] != 0){
        hashKey += 1;
    }
    return hashKey;
}

谢谢。

您没有检查您在
while
循环中是否超出了
哈希表数组的索引界限。你可以做:

while (hashKey < hashTableArray.length && this.hashTableArray[hashKey] != 0){
while(hashKey
Reimeus指出了超出边界的问题并给出了解决方案。我只想补充一下您处理碰撞的方法

您的函数看起来像<强>打开地址< /强>方法,而不是<代码> HASKEK+= 1;可能您可以考虑在 < /P>中增加<代码>

 public int linearHash(int in){   
    int hashKey = in%hashTableArray.length;
    while(this.hashTableArray[hashKey] != 0){
        in ++;
        hashKey = in%hashTableArray.length;
    }
    return hashKey;
}
上面的示例代码没有检查哈希表溢出。自动递增的次数不应超过
hashTableArray.length
次。否则您的程序将陷入死循环


请注意,通过检查
hashTableArray[hashKey]来确定插槽是否空闲!=0
是不安全的。例如,元素中有数字
0
20000

正如@Reimeus在下面所说的,对于开放寻址
hashKey
来说,如果到达数组的末尾,它应该返回到零。注意,如果数组已满,不要进入无限循环。