Condiere el artículo de Mckenzie et al. en. Selecting a
Hashing Algorithm, SP&E
20(2):209-224, Feb 1990 para mayor información sobre el tema.
Una buena función de hash es la djb2, la cual es una variante
del algoritmo popularizado por Dan J. Bernstein.
En todos los casos indicados abajo, recomiendo utilizar el
método multiplicativo para llegar a un valor dentro del rango de
la tabla hash.
hashFunction(str) = m*ParteFraccionaria(0.61803*hash(str));
unsigned long hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
static unsigned long sdbm(unsigned char *str)
{
unsigned long hash = 0;
int c;
while (c = *str++)
hash = c + (hash << 6) + (hash << 16) - hash;
return hash;
}
unsigned long hash(unsigned char *str)
{
unsigned int hash = 0;
int c;
while (c = *str++)
hash += c;
return hash;
}
Una mejora es juntar caracteres de a dos o tres y sumarlos (no en grupos de a un caracter como aquí).