试图加倍哈希

时间:2014-02-23 07:41:21

标签: java hashmap hashtable double-hashing

public class HashTable <K, V> implements Table<K, V>{
    PairHolder table[];
    int idx;
    public HashTable(int size){
        table=new PairHolder[size];
    }   
    public void put(K key, V value) {
        int hVal = key.hashCode();  
        int index = hashFunc1(hVal);
        int temp = hashFunc2(hVal);
        int col = index +=temp;

        while(table[index]!=null){
            index += temp;
            index %=table.length;
        }
        table[index].value=value;

    }
}
public int hashFunc1(int key){
    int abs = Math.abs(key%table.length);
    return abs;
}

public int hashFunc2(int key){
    int abs = Math.abs(5-key%5);
    return abs;
}

我正在尝试加倍哈希,我对如何做到这一点很困惑。我认为我走在正确的轨道上,但这是NullPointerException table[index].value=value;

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

想想这个剪了一分钟:

while(table[index]!=null){
    index += temp;
    index %=table.length;
}
table[index].value=value;

无限循环,直到table[index] 为止,然后继续。根据定义,当你到达最后一行时,table[index]必须为null,并且当你试图取消引用它时,肯定会抛出一个NullPointerException!

也许你想要这样的东西?

while(table[index]!=null){
    index += temp;
    index %=table.length;
}
table[index] = new PairHolder(key,value);

在完成这项工作后,并不完全清楚你打算如何实施......但它修复了你的空指针:)

如果我“更正”你的代码,你知道为什么另一个帖子中的海报说你实际上并不是双重哈希?

public void put(K key, V value) {
    int keyInt = key.hashCode();  
    int hash1 = hashFunc1(keyInt);
    int hash2 = hashFunc2(keyInt);

    int index = hash1 % table.lenght;
    int temp = hash2;
    //etc etc
}

public int hashFunc1(int key){
    int abs = Math.abs(key);
    return abs;
}

public int hashFunc2(int key){
    int abs = Math.abs(5-key%5);
    return abs;
}