我有一个哈希函数:
unsigned long strhash(char *string)
{
unsigned long hash = 5381;
int c;
while (c = *string++)
{
hash = ((hash << 5) + hash) + c;
}
return hash;
}
我的程序就像这样调用
char testString[] = "Hello World";
unsigned long hashcode = 0;
hashcode = strhash(testString);
int slot = 0;
slot = hashcode%30;
printf("%d\n", slot);
模块是模块我的数组的大小 这是安全地从unsigned long转换为int吗? 因为它打印出17让我觉得它有效但我不确定
答案 0 :(得分:0)
注意:我假设您在最后一个声明中表示printf("%d\n", slot);
。
通过使用30进行模数,您实际上将哈希值限制为仅30个唯一值(0到29)。这大大降低了散列的有效性,因为许多不同的字符串将映射到相同的散列值(30个中的一个)。
这个link为您提供了许多替代哈希函数,包括您问题中djb2
算法的unsigned int版本。请改用其中一个。