Esto intenta mejorar la aleatoriedad del valor tomado del hashCode (). El problema es que tiene un error sutil.
x.hashCode () * p
Esto toma un código hash pero lo multiplica por una constante, que con suerte es un número impar razonablemente grande.
- ¿Es el código de computadora una forma de representación matemática?
- ¿Alguien podría recomendar algunos temas interesantes para dominar que se encuentran en la intersección de la informática / programación y la teoría / lógica de conjuntos (algo práctico, no solo teórico)?
- ¿Cuál es una mejor especialización, CS o matemáticas?
- ¿Qué buscan las escuelas de posgrado en estadística / aprendizaje automático en Ph.D. ¿solicitantes?
- ¿Qué notación asintótica se usa con más frecuencia para los algoritmos y por qué?
El error esta aqui
Math.abs (x.hashCode () * p)
Incluso si x.hashCode () siempre es positivo cuando lo multiplica por p, puede desbordarse y ser negativo. ¿Pero Math.abs que hacen que esto no sea negativo? desafortunadamente no siempre. El problema es el número Integer.MIN_VALUE que no tiene un equivalente positivo, por lo que Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE (es decir, se desborda a un número negativo en sí mismo)
La solución es tomar el módulo% primero y luego usar Math.abs
cubo = Math.abs (x.hashCode () * p% tablesize);
Este es un error particularmente grave porque puede ejecutar muchas pruebas, ejecutar durante mucho tiempo en producción y nunca encontrar este error. Tiene una probabilidad de 1 en 4 mil millones de encontrarlo por accidente.
Por cierto. La multiplicación es relativamente costosa y no es una gran función de agitación. Una mejor opción es una función como esta que HashMap solía usar antes de cambiar a árboles en lugar de listas para colisiones.
hash estático int (int h) {
// Esta función asegura que los códigos hash que difieren solo por
// los múltiplos constantes en cada posición de bit tienen un límite
// número de colisiones (aproximadamente 8 con el factor de carga predeterminado).
h ^ = (h >>> 20) ^ (h >>> 12);
devuelve h ^ (h >>> 7) ^ (h >>> 4);
}
Esta función garantiza que los bits más bajos sean más aleatorios.