HashCode() (Java)

De Wikipedia, la enciclopedia libre

En el lenguaje de programación Java un HashCode es un identificador de 32 bits que se almacena en un Hash en la instancia de la clase. Toda clase debe proveer de un método hashCode() que permite recuperar el Hash Code asignado, por defecto, por la clase Object. El HashCode tiene una especial importancia para el rendimiento de las tablas hash y otras estructuras de datos que agrupan objetos en base al cálculo de los HashCode.
Todas las clases heredan de java.lang.Object un sistema básico para el uso de hash, aunque es común sobreescribir este para obtener una función hash que maneje de forma más específica los datos contenidos.
Normalmente se sobrescribe el método para que se comporte de forma acorde a la que lo hace .equals(), es decir, si el método .equals() dice que si dos objetos son iguales, estos han de tener el mismo valor hash.
No hay requisitos que obliguen a mantener el mismo hash en diferentes implementaciones de Java o ejecuciones, es más, aunque lo ideal es que no existan, no es fundamental que no existan colisiones de hash.[1]

Función hashCode() de los objetos String[editar]

En las primeras versiones de Java, el hash code de un objeto String se calculaba con base en los primeros 16 dígitos, algo que resultaba muy ineficaz a la hora de implementar tablas hash, por lo que desde Java 1.2, el hash code se calcula con base en todos los elementos del String siguiendo la siguiente fórmula:

Ejemplo[editar]

En este ejemplo se genera un hash code para un objeto Empleado basándonos en su ID, el hash code de su nombre y de su departamento. Cuanto más elaborada sea la función menos colisiones existirán en nuestro hash.

public class Empleado {
    int        IDempleado;
    String     nombre;
    Departamento dept;

    // Métodos de la Clase 

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + IDempleado;
        hash = hash * 31 + nombre.hashCode();
        hash = hash * 13 + ((dept == null) ? 0 : dept.hashCode());
        return hash;
    }
}

Referencias[editar]

  1. java.lang.Object.hashCode() documentation, Documentación Java SE 1.5.0, Oracle Inc.