que estaba buscando a través de algunas de la fuente .net ayer y vi varias implementaciones de GetHashCode con algo en la línea de este:.Net GetHashCode Bit operación de cambio
(i1 << 5) + i^i2
Entiendo lo que el código está haciendo y por qué . Lo que quiero saber es por qué usaron (i1 < < 5) + i en lugar de (i1 < < 5) - i.
La mayoría de los marcos que he visto usan -i porque eso es equivalente a multiplicar por 31 que es primo, pero el modo de Microsoft es equivalente a multiplicar por 33 que tiene 11 y 3 como factores y por lo tanto no es primo.
¿Existe una justificación conocida para esto? ¿Alguna hipótesis razonable?
bien, descubrí por qué Microsoft utiliza 33. Eso se llama el Bernstein Hash. Resulta que 33 tiene algunas propiedades mágicas que producen una buena distribución de códigos hash y hay muy pocos conocimientos teóricos sobre por qué. –