Я пытаюсь написать программу 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, потому что я не знаю, какие параметры (ключ, len, seed) они принимают.
Нормально ли получить более 35% столкновений, даже с использованием djb2, или я делаю что-то неправильно? Каковы значения ключа, len и seed?