我很好奇问题是需要使用不同的哈希函数还是我的代码出了问题。我需要将单词哈希存储在哈希表中,虽然该函数似乎工作正常,但当我输入非常长的单词时,有些单词达到了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;
}
unsigned long long
,它不能为负数。然而,如果该值超出了int
的范围,这种情况经常发生,那么将其转换为(有符号的)int
具有实现定义的行为,可能包括产生负结果。 - John Bollinger