Si usa el propio menú de refactorización de Visual Studio para agregar una implementación GetHashCode a una clase como esta:
y seleccione la única propiedad int de la clase:
genera este código en .NET Framework:
public override int GetHashCode()
{
return -1937169414 + Value.GetHashCode();
}
( HashCode.Combine(Value)en su lugar, genera en .NET Core, que no estoy seguro si implica el mismo valor)
¿Qué tiene de especial este valor? ¿Por qué Visual Studio no usa Value.GetHashCode()directamente? Según tengo entendido, realmente no afecta la distribución de hash. Como es solo una suma, los valores consecutivos aún se acumularían juntos.
EDITAR: solo intenté esto con diferentes clases con Valuepropiedades, pero aparentemente el nombre de la propiedad afecta el número generado. Por ejemplo, si cambia el nombre de la propiedad a Halue, el número se convierte en 387336856. Gracias a Gökhan Kurt que señaló esto.
int.
-1937169414es la multiplicación entera de -1521134295y -783812246. El número más significativo aquí es el -1521134295que aparece en cada cálculo de código hash. -783812246es el número de semilla Se elige un número de semilla en función del número de miembros en la ecuación. En las clases anónimas, el número de semilla se calcula en función de los nombres de campo. Por lo tanto, hay tantos números de semillas como números enteros. Podemos suponer que un número de semilla es aleatorio. En cuanto a la importancia de -1521134295, creo que reduce la colisión y solo un desarrollador interno podría responder con precisión cómo.

