我很好奇,如果问题是我需要一个不同的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;
}
答案 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
,并且应该重命名该变量,以免与函数名称冲突。