No existe una "buena función hash" para los 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 del todo bueno para las tablas hash, lo que probablemente quieras decir.
Las tablas hash tienen requisitos muy diferentes. Pero aún así, encontrar una buena función hash universalmente es difícil porque los diferentes tipos de datos exponen información diferente que puede ser hash. Como regla general, es bueno considerar toda la información que un tipo contiene por igual. Esto no siempre es fácil o incluso posible. Por razones de estadísticas (y por lo tanto colisión), también es importante generar una buena distribución en el espacio del problema, es decir, todos los objetos posibles. Esto significa que cuando los números hash 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 últimos tres los dígitos determinan el hash.
Del mismo modo, cuando se combinan cadenas, es importante tener en cuenta todos los caracteres, excepto cuando se sabe de antemano que los primeros tres caracteres de todas las cadenas serán los mismos; considerando esto, 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 The Art of Hashing de Julienne Walker .