Versión original tomada de http://www.cs.yorku.ca/~oz/hash.html

Funciones Hash

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


djb2

Este algoritmo evalua: hash(i) = hash(i - 1) * 33 ^ str[i]; el número "mágico" 33 (por qué funciona mejor que otros constantes) no ha sido adecuadamente explicado. Notar que 33x = 32x+x = x*25 +x = x<<5+x
    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;
}


sdbm

Este algoritmo fue creado para la biblioteca de la base de datos sdbm. Se encontró que tiene buen desempeño como función de hash general. La función es: hash(i) = hash(i - 1) * 65599 + str[i]; La versión de abajo es más rápida (la multiplicacióin es más lenta que dos desplazamiento y una resta. La constante  65599 es un número primo tomado luego de experimentar con varios otros.
    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;
}


Perdedor entre los perdedores

Esta función apareció en la primera edición del texto de Kernighan and Richie. Tenía la advertencia: "Este no es el mejor algoritmo posible, pero tiene el mérito de ser extremadamente simple." En realida es in algoritmo de hash terriblemente malo.
    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í).