Простые хеш-функции
я пытаюсь написать C Программа, которая использует хэш-таблицу для хранения разных слов, и я мог бы использовать некоторую помощь.
Во-первых, я создаю хеш-таблицу с размером простого числа, которое ближе всего к числу слов, которые я должен сохранить, а затем я использую хеш-функцию, чтобы найти адрес для каждого слова. Я начал с самой простой функции - сложения букв вместе, что привело к столкновению на 88%. Затем я начал экспериментировать с функцией и обнаружил, что все, что я изменяю, столкновения нет ниже 35%. Прямо сейчас ям использую
unsigned int stringToHash(char *word, unsigned int hashTableSize){
unsigned int counter, hashAddress =0;
for (counter =0; word[counter]!='\0'; counter++){
hashAddress = hashAddress*word[counter] + word[counter] + counter;
}
return (hashAddress%hashTableSize);
}
это просто случайная функция, которую я придумал, но она дает мне лучшие результаты - столкновение около 35%.
Последние несколько часов я читал статьи о хэш-функциях, и я попытался использовать несколько простых, таких как djb2, но все они дали мне еще худшие результаты (djb2 привел к коллизии 37%, что 'намного хуже, но я ожидал чего-то лучшего, а не худшего)не знаю, как использовать некоторые другие, более сложные, такие как murmur2, потому что я нене знаю, какие параметры (key, len, seed) они принимают.
Нормально ли получать более 35% коллизий, даже с использованием djb2, или я делаю что-то не так? Каковы ключевые, лен и начальные значения?