Se nos dice que debemos implementar hashCode() para nuestras clases, pero la mayoría de la gente como yo no tiene una idea real de cómo hacer esto o qué pasa si lo hacemos "mal". Por ejemplo, necesito una función hash para indexar nodos en un árbol (Finding the most frequent subtrees in a collection of (parse) trees). En este caso, necesito generar hashcodes recursivamente en base a nodos hijo ordenados, p.¿Hay una función hash "suficientemente buena" para el programador promedio?
hashCode = function(child1.hashCode, child2.hashCode, ...)
En un recent discussion de hashcodes respuestas incluyeron un hash para cadenas (basado en una larga Prime y 31) y también bitshifting. The String hash es:
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
No me interesan las colisiones ni la seguridad. ¿Existe una "función universal" para combinar códigos hash de objetos ordenados que harán más bien que daño (y más bien que no llamarlo en absoluto)?
¿También hay un sitio donde podemos buscar casos comunes? cadenas, listas, etc.)
No especifiqué un idioma, ya que esperaba que hubiera enfoques universales. Pero si es muy específico del idioma, indique el idioma y por qué no es universal.
ACTUALIZACIÓN Dos sugerencias son para utilizar el generador de hashCode del IDE. Eso parece un excelente incumplimiento; Aquí es Netbeans:
public int hashCode() {
int hash = 5;
// objects
hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : 0);
hash = 97 * hash + (this.tableElement != null ? this.tableElement.hashCode() : 0);
// a string
hash = 97 * hash + (this.tag != null ? this.tag.hashCode() : 0);
return hash;
}
Esto parece lo que quería. Para citar desde Commons: "Esta clase permite construir un buen método hashCode para cualquier clase. Sigue las reglas establecidas en el libro Effective Java de Joshua Bloch. Escribir un buen método hashCode en realidad es bastante difícil. simplifique el proceso. " Dudo que esto me haga una mejor persona (aunque me preocupan los derechos morales de los autores) pero espero que me haga un mejor programador ... –
aceptado ya que el enfoque de Bloch es lo que estaba buscando –
Lamentablemente, esos enlaces ahora están muertos. :( – Skrylar