散列函数问题 - 添加功能

时间:2016-10-19 19:54:38

标签: c hash hashmap hashtable

我尝试在djb2哈希函数中添加功能,但它似乎并不喜欢这些更改。具体来说,我试图包含一个将单词(字符串)转换为小写的循环。它抛出以下两个错误:

  1. char *
  2. 分配给int的指针转换不兼容
  3. 无法增加char *[45]
  4. 类型的值

    请注意,原始代码*str++出现在while循环中。这是我的第一个哈希表,我对指针很不稳定。任何洞察我出错的地方都将不胜感激。

    // djb2 by Dan Bernstein -- slightly modified;
    unsigned int hash_function(const char* str)
    {
        unsigned int hash = 5381;
        int c;
        char* string[45];
    
        for (int i = 0; str[i] != '\0'; i++)
        {
            string[i] = (tolower(str[i]));
        }
    
        while (c == *string++)
            hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
    
        return (hash % LISTS);
    }
    

2 个答案:

答案 0 :(得分:1)

此:

char* string[45];

表示&#34; 45个字符指针的数组&#34;,你应该删掉星号。

并且您无法通过递增变量来迭代数组,因此无法更改数组变量。您可以使用单独的指针:

const char *s = string;
while (c = *s++)

请注意,作业拼写为=,而==则是对等的比较,这不是您的意思。

答案 1 :(得分:1)

更高效的哈希版本:

unsigned int hash_function(const char* str)
{
    unsigned int hash = 5381, c;
    while(c = *str++) 
      hash += (hash << 5) + (c | 040);

    return (hash % LISTS);
}