Estoy leyendo a través de Chapter 3 de de Joshua Bloch Effective Java. En Tema 8: Siempre anular hashCode cuando se sobrescribe equals, el autor utiliza el paso siguiente que combina en su función hash:En la multiplicación de enteros, desbordamiento y pérdida de información
result = 37 * result + c;
A continuación, explica por qué 37 se eligió (el subrayado es nuestro):
Se eligió el multiplicador 37 porque es un primo impar. Si fue par y la multiplicación se desbordó, la información se perdería porque la multiplicación por dos es equivalente a cambiar. Las ventajas de usar un número primo son menos claras que , pero es tradicional usar primos para este propósito.
Mi pregunta es ¿por qué es importante que el factor de combinación (37) es extraña? ¿El desbordamiento de la multiplicación no resultaría en una pérdida de información independientemente de si el factor era impar o par?
Ah, así que no es solo un poco de pérdida de información lo que puede obtener del desbordamiento que nos preocupa, ¿es * completa * la pérdida de información que puede obtener al cero el resultado? –
@BilltheLizard: en realidad, son datos de propiedades múltiples que se emulan entre sí. Asumiendo tres propiedades a, b, yc usando el algoritmo anterior 'resultado = 2 * (2 * a + b) + c', puede ver que habrá duplicación en muchos conjuntos quizás comunes de 'a, b, c'. Si usa un primo impar como constante, la posibilidad de tener un conjunto con los mismos valores hash es mucho menor. –
El problema se manifiesta incluso antes de haber eliminado completamente el resultado. Considere multiplicar un hash de 8 bits por un multiplicador de dos solo una vez: comenzó con 256 valores posibles y finaliza con 128 valores posibles. –