Warum akzeptiert c # hashSet das Hinzufügen von zwei Objekten mit demselben Wert für getHashCode ()?

7

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 ...

    
Jerome 06.06.2012, 15:06
quelle

3 Antworten

22

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.

    
jason 06.06.2012, 15:07
quelle
8

Das Überschreiben von GetHashCode ist nicht genug. Sie müssen auch die Equals-Funktion überschreiben.

    
GianT971 06.06.2012 15:10
quelle
1

Verwenden Sie nicht Hash-Sets, um doppelte Werte zu vermeiden. Verwenden Sie sie, um Hashtabellen auszugleichen!

    
asawyer 06.06.2012 15:07
quelle

Tags und Links