Hash function issue - adding functionality

落花浮王杯 提交于 2021-01-28 19:21:47

问题


I tried adding functionality to the djb2 hash function, but it doesn't appear to like the changes. Specifically, I'm trying to include a loop that converts words (strings) to lower case. It throws the following two errors:

  1. Incompatible integer to pointer conversion assigning to char * from int
  2. Cannot increment value of type char *[45]

Note that in the original code *str++ appeared in the while loop. This is my first hash table, and I'm rather shaky on pointers. Any insight on where I've gone wrong would be appreciated.

// 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);
}

回答1:


More efficient version of your hash:

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

    return (hash % LISTS);
}



回答2:


This:

char* string[45];

means "array of 45 character pointers", you should drop the asterisk.

And you can't iterate over an array by incrementing the variable, the array variable cannot be changed. You can use a separate pointer:

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

Note that assignment is spelled =, while == is comparison for equality which is not what you mean.



来源:https://stackoverflow.com/questions/40140390/hash-function-issue-adding-functionality

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!