使用双重散列对字符串进行冲突解决?

时间:2015-04-06 21:58:34

标签: c hash hashmap hashtable double-hashing

我有一个大约10k字符串的输入文件。 我需要数一数。使用开放寻址,双重哈希的冲突。然而,代码进入无限循环,即,它根本无法找到任何空的地方填充! (输入大于1000)。

根据给我的问题,我们应该使用它。 First Hash:ASCII的总和 第二个哈希:分区,即mod sizeof(Prime)

我认为这与我的哈希函数有关。

我已经使用以下内容创建了一个用于存储字符串的结构数组。

struct table{
    char word[50];
};

然后按如下方式创建一个数组:

struct table*array=(struct table*)malloc(10000*sizeof(struct table));

以下是我使用的2个哈希函数:

int hash1(char* name) //This function calculates the ascii value
{
    int index=0;int i=0;
    for(;name[i]!='\0';i++)
    {
        index+=name[i];
    }
    return index;

}

int hash2(int index) //Calculates offset (mod with a large prime,Why do we do this?)
{
    int offset=index%1021;
    return offset;
}

下面是我的插入功能。

insert(char* name)
{
    int offset=0,index=0;
    index=hash1(name);//calculate the index from string
    index=index % 10000;//to keep index between 0-10k range
    while((array[index].word[0]!='\0')) // checking if space in array empty
    {
        collision+=1;    //global counter
        offset=hash2(index); //offset
        index=index+offset;
        index=index%10000;
    }
    strcpy(array[index].word,name);
    return array;

}

如何改进我的哈希函数,使其访问阵列上的所有10k位置。 ?(或完全改变)。

根据给我的问题,我们应该使用它。 First Hash:ASCII的总和 第二个哈希:分区,即mod sizeof(Prime)

0 个答案:

没有答案