хорошая хеш-функция - PullRequest
1 голос
/ 21 января 2012

Мне не удалось понять структуру хэш-функций.Я шел через пример.Как вы можете видеть в комментариях к функции, почему вы должны выбрать 31 в качестве числа для умножения.Как вы решаете?Это что-то случайное или что-то значит?

unsigned int hash(hash_table_t *hashtable, char *str)
{
    unsigned int hashval;

    /* we start our hash out at 0 */
    hashval = 0;

    /* for each character, we multiply the old hash by 31 and add the current
     * character.  Remember that shifting a number left is equivalent to 
     * multiplying it by 2 raised to the number of places shifted.  So we 
     * are in effect multiplying hashval by 32 and then subtracting hashval.  
     * Why do we do this?  Because shifting and subtraction are much more 
     * efficient operations than multiplication.
     */
    for(; *str != '\0'; str++) hashval = *str + (hashval << 5) - hashval;

    /* we then return the hash value mod the hashtable size so that it will
     * fit into the necessary range
     */
    return hashval % hashtable->size;
}

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Хэш, о котором идет речь, известен как хэш Бернштейна, хеш Торека или просто хэш "времен 33".Он довольно популярен благодаря своей простоте, скорости и приличному распространению со английскими строковыми данными.

Ваши комментарии отмечают, что на самом деле он умножается на 31, что вам показалось произвольным и фактически является немного произвольным. Apache Portable Runtime имеет комментарий в своем источнике хеш-алгоритма , в котором отмечается, что многие возможные константы работают хорошо (33 являются наиболее распространенными).Все они странные и близки к степени 2, что означает, что они хорошо переводятся в сдвиги и сложения или вычитания.

Некоторые другие ресурсы, помогающие понять хеширование:

1 голос
/ 21 января 2012

Вот лекция по хеш-функциям с 65 000 просмотров.На YouTube: http://www.youtube.com/watch?v=KW0UvOW0XIo

Это не совсем то, что вы просите, однако ваши вопросы показывают, что ваши знания в области хеширования ограничены.Лучше прочитать учебник или проверить презентацию.

...