La comprensión de HashCode

Picadillo

Lo que es de hash

el hash, o la traducción de hash de hash, es la entrada de cualquier longitud (también llamado pre-mapping), el algoritmo de hash, para obtener una salida de longitud fija, y la salida es el valor hash. Esta conversión es un mapa de compresión, el valor hash espacio es típicamente mucho menor que el espacio de entrada, y como tal, de entrada, diferente puede obtener el mismo valor hash. Un valor hash no puede ser determinada de manera única por el valor de entrada. Para el libro es un simple mensaje de longitud arbitraria se comprime a un mensaje de longitud fija función digerir.

característica

El mismo valor hash necesariamente el mismo objeto, valores de hash de diferentes objetos puede ser el mismo.
porque la longitud de la asignada más baja que él, puede ocurrir El mapeo de longitud arbitraria a una longitud fija, el conflicto hash.

Las funciones hash común

Acceso directo Conormal

Multiplicador de toda la ley

método reno Square

Código hash

hash de HashCode se obtiene, como la posición de representación en la tabla hash, o la naturaleza de una función hash para obtener un valor entero es un par de valores hash. (Diferente para diferentes algoritmos HashCode la imagen).
Aunque hashCode representa la posición en la tabla hash, pero esta posición se obtiene mediante la función hash, en lugar de un hash de búsqueda de obtener la tabla.
En resumen, es la ubicación en la tabla hash, la posición indicada por el hashCode objeto obtenido por el algoritmo.
Esta es la razón por qué no utilizar este HashMap a los tipos de datos básicos, porque no hay manera de conseguir hashCode.

Object.hashCode ()

método HashCode llamada a la imagen, es un método nativo, y esto se convierte en una dirección física de la ubicación en la que la imagen será un número entero, mediante el cálculo de los rendimientos función hash un valor entero obtenido. Si dos objetos es igual a la misma, entonces el código hash debe ser el mismo, por lo que cuando definimos un objeto, por lo general reescribir la causa de iguales y código hash.

es igual y código hash:
Si no se sobreescribe, todos los nuevos objetos no son las mismas (diferentes iguales, es igual a la comparación por defecto es la dirección de dos referencias a objetos , así que sea seguro, pero en general, porque creemos que el valor puede ser igual, entonces sería reemplazar el método es igual, y debido a hashCode y equals están relacionados, por lo que anulará el método de código hash).
Si dos objetos es igual a la misma, entonces el código hash necesariamente los mismos.
Si dos objetos de diferente código hash, a continuación, los iguales deben ser diferentes.

Objects.hashCode (), Arrays.hashCode ()

 public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

//这个是Array.hashCode()    
public static int hashCode(Object a[]) {
        if (a == null)
            return 0;

        int result = 1;

        for (Object element : a)
            result = 31 * result + (element == null ? 0 : element.hashCode());

        return result;
    }

Objects.hashCode está llevando el Objeto hashCode, entonces llama a la HashCode apropiado dependiendo del tipo del objeto mediante la conversión de la matriz objeto de parámetro, se calcula.

String.hashCode ()

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

La cadena en una matriz de caracteres, se calcula el código de carácter ASCII Hash, h = 31 * h + val [i]; ¿Por qué 31 está dispuesto, se explica más adelante.

Interger.hashCode ()

  public static int hashCode(int value) {
        return value;
    }

valor de retorno directo

papel hashCode

HashCode calculada, la posición del objeto se puede obtener directamente correspondiente a la tabla hash, sin la necesidad de encontrar la ubicación por la que atraviesa la tabla hash, para mejorar la eficiencia de la focalización.
Por ejemplo: Tenemos un número de 1000, cuando la tienda, si ha almacenado durante 900, 901 cuando es necesario comparar la anterior 900 del depósito, y por hashCode no se puede comparar tantas veces. Esa es la única Cohen conflicto hash. Sin embargo, la eficacia sigue siendo alta.

iguales 和 hashCode

¿Por lo general debe pasar por encima iguales reescribir hahsCode
pensar que si reemplaza los iguales, hashCode no escribió, a continuación, los dos objetos al mismo tiempo como iguales, entonces teóricamente hashCode que debe hacer la misma fase, pero en realidad es diferente. Así que ser reescrito.
El valor por defecto es comparar dos iguales referencia a una dirección de objeto , por lo que sin duda, pero en general, porque creemos que el valor puede ser igual, entonces se podría reemplazar el método es igual, y debido a hashCode y equals están relacionados, por lo que se anulará el código hash método.

		TestMe me = new TestMe("nan");
        TestMe metwo = new TestMe("nan");
        TestMe mePointer = me;
        System.out.println(me.hashCode());
        System.out.println(mePointer.hashCode());
        System.out.println(metwo.hashCode());
        System.out.println(mePointer.equals(me));
        //输出
        //1956725890
        //1956725890
		//356573597
		//true

¿Por qué es 31

La razón para el uso de 31 años, porque es un número primo impar. Si el factor multiplicador es un número par, y luego la multiplicación de desbordamiento, los datos se perderán, ya que la operación de cambio es equivalente a multiplicar 2 (baja complemento 0).

  • La razón para usar un número primo se multiplica por un número primo, es menos propenso a conflictos. Debido a que sólo un factor primordial en sí mismo.
    Por ejemplo: 7 y 8:
    Al calcular el "4 2", el hashCode 7 = 2 + 4 = 18 es, y el otro 8 ; 2 + 4 = 20
    "12 es 1" cuando se calcula, el hashCode = 7 . 1. 19 = + 12 es; otro 8 1 + 12 = 20, el conflicto.

  • La razón 31 es distribuido por la decisión , mayor, mayor es la posibilidad de desbordamiento, la más pequeña, la posibilidad de conflicto.

  • 31 tiene un buen rendimiento, es decir, un cambio en lugar de una multiplicación y la resta , mejor rendimiento se puede obtener: 31 * i == (i << 5) - i, VM moderna Esta optimización se puede hacer automáticamente. Esta fórmula se puede deducir muy simple.

  • Este hecho puede (32 I <<. 5 = I, a continuación, 31 se i = I-I <<. 5), tal como 63 puede ser tan

  • 31 Con el fin de utilizar lo más importante es el rendimiento. Por supuesto, también se puede utilizar 63. Pero el riesgo de desbordamiento 63 es aún mayor. Así que 15? Piense también disponible. (Espacio Cuanto más grande, más pequeño es el potencial de conflicto, pero puede desbordarse y más grande; el más pequeño, la posibilidad de conflicto, derrame menos probable).

Publicado 12 artículos originales · ganado elogios 0 · Vistas 189

Supongo que te gusta

Origin blog.csdn.net/N_a_n/article/details/105192791
Recomendado
Clasificación