C中的哈希函数给出负数

时间:2016-10-11 15:37:26

标签: c hash hashtable

我很好奇,如果问题是我需要一个不同的Hash函数或者我的代码有问题。我需要哈希单词存储在哈希表中,一切似乎都能正常使用该函数但是当我输入很长的单词时,有些单词是45个字符,即使我要求得到一个unsigned long long返回对我来说,我收到的哈希是一个负数。

以下是代码,非常感谢您的帮助。

unsigned long long hash(char* str);

int main (void)
{
    int numItems;
    char name[46];
    printf("Please enter how many items will be in your hashtable:");
    scanf("%d", &numItems);

    for (int i = 0; i < numItems; i++)
    {
        int key = 0;
        printf("Please type a name to be entered into the Hashtable:");
        scanf("%s", name);

        //run the word through a hashfunction (simple hashfunction)

       //print the hash number
        key = hash(name);

        printf("%d\n", key);
    }
}
unsigned long long hash(char* str)
    {
        unsigned long hash = 5381;
        int c;
        for (int i = 0; i < strlen(str); ++i) 
            {
                c = (int) str[i];
                hash = ((hash << 5) + hash) + c; 
            }
        return hash;
    }

1 个答案:

答案 0 :(得分:2)

hash函数返回unsigned long long,但您将结果存储在int

key的类型更改为unsigned long long,然后使用%llu格式说明符进行打印。

unsigned long long key = 0;
....
printf("%llu\n", key);

此外,hash函数内的hash变量应该具有类型unsigned long long,并且应该重命名该变量,以免与函数名称冲突。