El cálculo hash es calcular qué elemento debe colocarse en la matriz. Para ser precisos, se coloca en la lista de enlaces. Según las reglas de Java, si desea poner un objeto en un húsico, la clase de su objeto debe proporcionar un método hashcode y devolver un valor entero. Por ejemplo, la clase de cadena tiene los siguientes métodos:
public int hashcode () {int h = hash; int len = count; if (h == 0 && len> 0) {int off = offset; char val [] = valor; para (int i = 0; i <len; i ++) {H = 31*H+val [Off ++]; } hash = h; } return h; } Presta atención al bucle for arriba, ¿no está un poco desordenado? Déjame darte un ejemplo para que sea fácil entender lo que está haciendo. Por ejemplo, hay una cadena "ABCDE" que usa un método de cálculo de 31 dígitos para calcular la suma de esta cadena. Escribirá la siguiente fórmula de cálculo:
A*31^4+B*31^3+C*31^2+D*31^1+E*31^0. Tenga en cuenta que A, B, C, D o E aquí se refieren a sus valores ASCII. Bucles muy interesantes, que se pueden usar para calcular n-dígito. Este bucle se puede extraer por separado como una buena herramienta para calcular la partición:
public static void main (string [] args) {int [] a = {1,0}; System.out.println (calcular (2, a)); } private static int calculate (int radix, int [] a) {int sum = 0; for (int i = 0; i <a.length; ++ i) {sum = sum*radix+a [i]; } suma de retorno; } El método estático caculado acepta a Radix como la cardinalidad, y la matriz A simula el número de calculaciones que se calculan, solo preste atención al orden de superficie consistente. Por ejemplo, la cadena binaria 01 debe organizarse en la matriz de acuerdo con {0,1}. La salida anterior es 1, que cumple con el valor verdadero de 01.
Entonces, ¿por qué usar 31 como base? Primero, debe entender por qué se necesita hashcode. Cada objeto calcula hashcode en función del valor. Aunque el tamaño de este código no requiere singularidad (porque esto generalmente será muy lento), debe ser lo más posible y no repetirse como sea posible, por lo que la cardinalidad debe ser lo más grande posible. Además, el compilador puede optimizar 31*N para cambiar de 5 bits y luego reducir en 1, lo que tiene un mayor rendimiento. De hecho, todavía es controvertido elegir 31, por favor consultelo aquí.
Creo que esto aún conducirá a más repeticiones y debería usar números más grandes. Entonces, tal vez pueda haber algunos cambios en la implementación de Java en el futuro. El siguiente artículo presenta dos conclusiones:
1. Use números primos para la cardinalidad
Las características de los números primos (solo 1 y en sí mismos son factores) pueden hacer que el resultado se obtenga multiplicándolo con otros números más fáciles de producir singularidad que otros métodos, es decir, la probabilidad de conflicto entre los valores del código hash es la más pequeña.
2. La opción 31 es una opción después de observar los resultados de la distribución. La razón no está clara, pero de hecho es beneficiosa.
Además, el primer valor calculado se almacenará en caché internamente, porque esta es una clase final (inmutable), es decir, el contenido del objeto de cadena no cambiará. Esto puede mejorar el rendimiento al poner hashmap varias veces, pero parece ser de poca utilidad.
Resumir
Lo anterior se trata de las razones por las cuales se usan 31 coeficientes al definir el codo hash. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
" Introducción detallada para reescribir los métodos hashcode () y igual () "
" Explicación detallada de las diferencias y conexiones esenciales entre hashcode () y igual () "
" Análisis del código fuente Java del uso de hashmap "
Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!