que tenían el siguiente código para generar un hash de un objeto:¿Esta función hash colisionará inusualmente con frecuencia?
public int GetHashCode(MyType obj)
{
return (obj.Prop1.GetHashCode() + obj.Prop2.GetHashCode() + obj.Prop3.GetHashCode()).GetHashCode();
}
es decir, Agrego todos los códigos hash de propiedades y luego tomo el hash de esto.
En revisión, un compañero de trabajo sugirió que esto colisionaría con demasiada frecuencia. No estoy seguro de que esto es verdad porque:
- Dado que los códigos hash se eligen con la misma frecuencia entre los números positivos y negativos y se envuelven alrededor, no creo que haya ninguna información adicional que obtenemos acerca de la probabilidad de la suma de estos números en oposición a los números
- En la medida en que su suma no es aleatoria, los códigos hash están diseñados para hacer que los números que están "muy juntos" se vuelvan "muy separados", por lo que alimentan de forma no uniforme -el valor distribuido en la función no debería ser un problema
¿Quién es correcto?
Está en C#, en caso de que la respuesta sea específica del idioma.
¿Cuál fue la razón de su compañero de trabajo? –