C语言中的哈希函数返回负数问题

3

我很好奇问题是需要使用不同的哈希函数还是我的代码出了问题。我需要将单词哈希存储在哈希表中,虽然该函数似乎工作正常,但当我输入非常长的单词时,有些单词达到了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;
    }

可能是Hash函数给我返回极大的数字的重复问题。 - too honest for this site
那实际上是同一个问题。你的代码调用了未定义的行为。而你没有修复在你第一篇帖子中被评论的任何问题。 - too honest for this site
你的哈希函数返回一个unsigned long long,它不能为负数。然而,如果该值超出了int的范围,这种情况经常发生,那么将其转换为(有符号的)int具有实现定义的行为,可能包括产生负结果。 - John Bollinger
将哈希计算为“unsigned long”,但返回值为“unsigned long long”,然后再将其分配给“int”有什么用途?您应该重新设计接口以实现一致性。 - too honest for this site
非常感谢您的帮助,这解决了我的问题。 - Tyler Gotto
1个回答

2
< p > hash函数返回一个unsigned long long,但你正在将结果存储在一个int中。

key的类型更改为unsigned long long,并使用%llu格式说明符打印它。

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

此外,在“哈希”函数内部,hash变量的类型应为unsigned long long,并且该变量的名称应更改,以避免与函数名称冲突。

@TylerGotto 点击这里阅读 - WhozCraig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接