Double Hashing java

时间:2014-02-23 03:36:54

标签: java hash hashmap hashtable double-hashing

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

    while(table[index]!=null&&table[index].getFirst() != 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;
}

我很难进行双重散列。任何帮助完成此代码以加倍哈希将是伟大的。

2 个答案:

答案 0 :(得分:3)

你所做的不是双重哈希。对于双散列,您需要两个单独的散列函数,而不是一个散列函数处理两种方式。在找到空插槽之前,您还没有继续探测;你假设如果第一个位置被占用,第二个位置将为空。您未处理table[col] == null案例或hashFunc2(key) == 0案例,或col超过表格末尾的情况。有关您应该做的事情的详细信息,请参阅Wikipedia

如果要执行双重散列,则需要两个散列函数。 Java只提供一个,因此可能使用Hasher<K>方法定义hash(K key)接口,并在哈希表的构造函数中使用Hasher。然后你的代码看起来像

hash1 = reduce(key.hash());
hash2 = convertToStep(hasher.hash(key));
while (table[hash1] is occupied by a different key) {
    hash1 += hash2;
    hash1 %= table.length;
}
table[hash1] = key-value pair;

reduce散列到表中的索引的函数可以非常简单,但convertToStep可能更精细。

要查找要使用的其他哈希函数,请查看Google string hash并查看出现的选项。许多将是相当复杂的,但应该有一些在你可以处理的范围内。您要避免the hash code Java already uses;你想要两个哈希函数,而不是一个有两个名字的函数。

要正确处理空值,最好在创建table时用PairHolder填充convertToStep。您可以在插入项目时填写键和值。

为确保您的步长始终保证找到空插槽,您需要确保{{1}}始终返回步骤的GCD和表长度为1的结果。可能就像总是返回一个奇数并使用2个表大小的幂一样简单。

答案 1 :(得分:0)