将散列键(unsigned long)安全地转换为int

时间:2014-05-13 03:40:37

标签: c hash hashcode

我有一个哈希函数:

 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让我觉得它有效但我不确定

1 个答案:

答案 0 :(得分:0)

注意:我假设您在最后一个声明中表示printf("%d\n", slot);

通过使用30进行模数,您实际上将哈希值限制为仅30个唯一值(0到29)。这大大降低了散列的有效性,因为许多不同的字符串将映射到相同的散列值(30个中的一个)。

这个link为您提供了许多替代哈希函数,包括您问题中djb2算法的unsigned int版本。请改用其中一个。