Funções hash simples

Estou tentando escrever umC programa que usa uma tabela de hash para armazenar palavras diferentes e eu poderia usar alguma ajuda.

Primeiramente, eu crio uma tabela de hash com o tamanho de um número primo que é o mais próximo do número de palavras que tenho que armazenar, e então eu uso uma função hash para encontrar um endereço para cada palavra. Comecei com a função mais simples, adicionando as letras juntas, o que acabou com 88% de colisão. Então comecei a experimentar a função e descobri que, seja lá o que eu mudar, as colisões não ficam abaixo de 35%. Agora estou usando

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);
}

que é apenas uma função aleatória que eu criei, mas me dá os melhores resultados - cerca de 35% de colisão.

Eu tenho lido artigos sobre funções hash nas últimas horas e tentei usar alguns simples, como o djb2, mas todos eles me deram resultados ainda piores (djb2 resultou em 37% de colisão, que é ' t muito pior, mas eu estava esperando algo melhor, em vez de pior) Eu também não sei como usar alguns dos outros, mais complexos, como o murmur2, porque eu não sei o que os parâmetros (chave, len , semente) eles pegam são.

É normal obter mais de 35% de colisões, mesmo usando o djb2, ou estou fazendo algo errado? Quais são os valores chave, len e seed?

questionAnswers(2)

yourAnswerToTheQuestion