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?

questionAnswers(2)

yourAnswerToTheQuestion