No existe la "buena función hash" para hash universales (ed. Sí, sé que existe el hash universal, pero eso no es lo que quise decir). Dependiendo del contexto, diferentes criterios determinan la calidad de un hash. Dos personas ya mencionaron SHA. Este es un hash criptográfico y no es para nada bueno para las tablas hash que probablemente quiera decir.
Las tablas hash tienen requisitos muy diferentes. Pero aún así, encontrar una buena función hash universalmente es difícil porque diferentes tipos de datos exponen información diferente que puede ser hash. Como regla general, es bueno tener en cuenta toda la información de que un tipo posee igualmente. Esto no siempre es fácil o incluso posible. Por razones de estadísticas (y, por lo tanto, de colisión), también es importante generar una buena dispersión sobre el espacio problemático, es decir, todos los objetos posibles. Esto significa que al mezclar números entre 100 y 1050 no es bueno dejar que el dígito más significativo juegue un papel importante en el hash porque para ~ 90% de los objetos, este dígito será 0. Es mucho más importante dejar que los tres últimos los dígitos determinan el hash.
De forma similar, cuando se trata de cadenas, es importante considerar todos los caracteres, excepto cuando se sabe de antemano que los primeros tres caracteres de todas las cadenas serán los mismos; teniendo en cuenta estos, entonces es un desperdicio.
Este es en realidad uno de los casos en los que aconsejo leer lo que Knuth tiene que decir en The Art of Computer Programming, vol. 3. Otra buena lectura es Julienne Walker's The Art of Hashing.
¿Ha considerado usar una o más de las siguientes funciones hash de propósito general: http://www.partow.net/programming/hashfunctions/index.html –
En fnv_func, el tipo de p [i] es char, ¿Qué pasará con h después de la primera iteración? ¿Se hizo a propósito? –
@martinatime dijo: * Hay una gran cantidad de información sobre funciones hash en wikipedia http://en.wikipedia.org/wiki/Hash_function y en la parte inferior de este artículo http://www.partow.net/programming/hashfunctions/ index.html tiene algoritmos implementados en varios idiomas. * – 2501