Proste funkcje mieszające
Próbuję napisaćC program, który używa tabeli mieszania do przechowywania różnych słów i mógłbym skorzystać z pomocy.
Po pierwsze, tworzę tabelę mieszania z rozmiarem liczby pierwszej, która jest najbliższa liczbie słów, które muszę przechowywać, a następnie używam funkcji mieszającej, aby znaleźć adres dla każdego słowa. Zacząłem od najprostszej funkcji, dodając litery razem, co skończyło się kolizją 88%. Potem zacząłem eksperymentować z tą funkcją i odkryłem, że cokolwiek zmieniam, kolizje nie spadają poniżej 35%. Teraz używam
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);
}
jest to tylko przypadkowa funkcja, którą wymyśliłem, ale daje mi najlepsze wyniki - około 35% kolizji.
Od kilku godzin czytam artykuły o funkcjach skrótu i próbowałem użyć kilku prostych, takich jak djb2, ale wszystkie dały mi jeszcze gorsze wyniki (djb2 spowodowało 37% kolizji, czyli „ o wiele gorzej, ale spodziewałem się czegoś lepszego niż gorszego) Nie wiem też, jak używać niektórych innych, bardziej złożonych, takich jak murmur2, ponieważ nie wiem, jakie parametry (klucz, len , nasiona), które biorą.
Czy normalne jest uzyskanie więcej niż 35% kolizji, nawet przy użyciu djb2, czy też robię coś złego? Jakie są wartości klucza, len i nasion?