Funciones hash simples

Estoy tratando de escribir unC programa que utiliza una tabla hash para almacenar diferentes palabras y podría usar alguna ayuda.

En primer lugar, creo una tabla hash con el tamaño de un número primo que es el más cercano al número de palabras que tengo que almacenar, y luego uso una función hash para encontrar una dirección para cada palabra. Comencé con la función más simple, agregando las letras juntas, que terminó con un 88% de colisión. Entonces comencé a experimentar con la función y descubrí que, independientemente de lo que cambie, las colisiones no son inferiores al 35%. Ahora mismo estoy 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 es solo una función aleatoria que se me ocurrió, pero me da los mejores resultados: alrededor del 35% de colisión.

He estado leyendo artículos sobre funciones hash durante las últimas horas y traté de usar algunas sencillas, como djb2, pero todas me dieron resultados aún peores (djb2 produjo una colisión del 37%, que es ' Mucho peor, pero esperaba algo mejor que peor. Tampoco sé cómo usar algunos de los otros más complejos, como el murmur2, porque no sé cuáles son los parámetros (key, len , semilla) que toman en son

¿Es normal obtener más del 35% de colisiones, incluso con el uso del djb2, o estoy haciendo algo mal? ¿Cuáles son los valores clave, len y semilla?

Respuestas a la pregunta(2)

Su respuesta a la pregunta