Ich habe ein CustomObject-Objekt, das GetHashCode () überschreibt. Ich habe ein HashSet, und ich bin in der Lage, Add mit zwei verschiedenen Objekt mit dem gleichen Hash-Code aufzurufen. Beide werden hinzugefügt und später bekomme ich Probleme mit der Datenbankeinfügung (Primärschlüssel-Duplikate) ... Der Zweck der Verwendung eines Hash-Sets wurde mit diesen Datenbankeinfügungen verbunden (Vermeidung von Schlüsselkollisionen).
Vermisse ich möglicherweise einige Eigenschaften von HashSet? Selbst wenn ich versuche, (.Contains) zu prüfen, bevor ich (.Add) hinzufüge, füge ich hashCode-Duplikate hinzu ...
Weil die HashSet<T>
-Mitgliedschaft auf der Objektgleichheit basiert, nicht auf der Hash-Code-Gleichheit. Es ist vollkommen legal, dass jedes Mitglied eines HashSet<T>
denselben Hash-Code hat, solange die Mitglieder gemäß Equals
unterschiedlich sind. Die Rolle, die Hash-Codes in HashSet<T>
spielen, dient zum schnellen Testen der Mitgliedschaft. Wenn Sie ein Objekt haben und sein Hash-Code nicht in HashSet<T>
ist, dann wissen Sie, dass das Objekt nicht in HashSet<T>
ist. Wenn Sie ein Objekt haben und sein Hash-Code in HashSet<T>
ist, müssen Sie die Kette von Objekten mit demselben Hash-Code durchgehen, um mit Equals
auf Gleichheit zu prüfen, um zu sehen, ob das Objekt tatsächlich in HashSet<T>
oder ist nicht. Aus diesem Grund ist eine ausgewogene Hash-Code-Verteilung wichtig. Es ist jedoch nicht so, dass eindeutige Hash-Codes notwendig sind.