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

时间:2012-11-02 21:17:39

标签: java hash hashtable integer-hashing

我正在进行一项任务,我必须将10,000个数字哈希到一个负载大小为.1,.2 .3 ....到.9的哈希表中。我的问题是我的散列函数给了我一些溢出或类似的东西。如果我正在为负载因子为.5的表做散列,如36077(mod)20,000,它会给我16070作为关键。这仅发生在高于负载系数的数字上。这是我的散列函数的代码。

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

谢谢。

2 个答案:

答案 0 :(得分:0)

您没有检查是否超出了hashTableArray循环中while的索引范围。你可以这样做:

while (hashKey < hashTableArray.length && this.hashTableArray[hashKey] != 0){

答案 1 :(得分:0)

Reimeus指出OutOfBound问题并给出了解决方案。我只是想补充一下你处理碰撞的方法。

您的功能看起来像开放式寻址方法。也许您可以考虑增加hashKey += 1;

而不是in
 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确定广告位是否免费是不安全的。例如,您的元素中有020000个数字。