Сейчас я читаю книгу K & R "C Programming Language". В главе "Структуры" под подтемой "Поиск в таблице" (Страница 144) я нашел эту функцию генерации хэша
#define HASHSIZE 101
struct nlist {
struct nlist *next;
char *name;
char *defn;
}
static struct nlist *hashtab[HASHSIZE];
unsigned hash(char *s)
{
unsigned hashval;
for (hashval = 0; *s != '\0'; s++)
hashval = *s + 31 * hashval;
return hashval % HASHSIZE;
}
Я не понимаю, что на самом деле делает эта функция.
Я думаю, что он генерирует уникальный адрес (как индекс для hashtab) для данной строки (char * s).
Но мне кажется, что двум различным строкам может присваиваться один и тот же индекс, поскольку (hashval% HASHSIZE) - данный адрес (203% 101 = 405% 101 = 1).
И почему HASHSIZE 101 и hashval умножаются на 31? Почему не 100 или 32?