Wenn Sie das Refactoring-Menü von Visual Studio verwenden, um einer Klasse wie dieser eine GetHashCode-Implementierung hinzuzufügen:
und wählen Sie die einzige int-Eigenschaft in der Klasse aus:
Dieser Code wird in .NET Framework generiert:
public override int GetHashCode()
{
return -1937169414 + Value.GetHashCode();
}
(Es wird HashCode.Combine(Value)stattdessen auf .NET Core generiert. Ich bin mir nicht sicher, ob es denselben Wert enthält.)
Was ist das Besondere an diesem Wert? Warum wird Visual Studio nicht Value.GetHashCode()direkt verwendet? Soweit ich weiß, hat dies keinen wirklichen Einfluss auf die Hash-Verteilung. Da es sich nur um eine Addition handelt, würden sich aufeinanderfolgende Werte immer noch zusammen ansammeln.
BEARBEITEN: Ich habe dies nur mit verschiedenen Klassen mit ValueEigenschaften versucht, aber anscheinend wirkt sich der Eigenschaftsname auf die generierte Anzahl aus. Wenn Sie beispielsweise die Eigenschaft in umbenennen Halue, lautet die Nummer 387336856. Vielen Dank an Gökhan Kurt, der darauf hingewiesen hat.
int.
-1937169414ist eine ganzzahlige Multiplikation von -1521134295und -783812246. Die bedeutendere Zahl ist hier, -1521134295die in jeder Hashcode-Berechnung erscheint. -783812246ist die Startnummer. Eine Startnummer wird basierend auf der Anzahl der Elemente in der Gleichung ausgewählt. In anonymen Klassen wird die Startnummer basierend auf Feldnamen berechnet. Es gibt also so viele Startzahlen wie ganze Zahlen. Wir können davon ausgehen, dass eine Startnummer zufällig ist. Was die Bedeutung von -1521134295betrifft, denke ich, dass es die Kollision reduziert und nur ein Insider-Entwickler in der Lage wäre, genau zu beantworten, wie.

