C# GetHashCode() Hochleistungs-Hashing-Algorithmus [Duplikat]
-
11-12-2019 - |
Frage
Mögliches Duplikat:
Was ist der beste Algorithmus für ein überschriebenes System.Object.GetHashCode?
Dies ist uns bekannt, wenn wir das überschreiben Equals
Methode von Object
In unseren benutzerdefinierten Typen sollten wir auch eine Implementierung von überschreiben und bereitstellen GetHashCode
Methode zur Unterstützung der Generierung eindeutiger Hash-Codes zur Verwendung zur Unterstützung Hashtable
Und Dictionary
Sammlungsklassen und können auch andere Klassen sein.
Dies erfordert die Implementierung des in unserem verwendeten Hashing-Algorithmus overriden
GetHashCode
Die Methode ist optimal und genau, d. h.Es generiert einen eindeutigen Hash dieses Typs und tut dies auch so schnell wie möglich, um die Leistung der Anwendung zu verbessern, die unseren Typ verwendet.
Meine Frage ist welche Hashing-Algorithmen sind genau und bieten optimale Leistung beim Einsatz GetHashCode
Implementierung?Oder sollten wir nur die Basistypen verwenden? GetHashCode
Implementierung?Ich würde diese Antwort gerne für beide wissen value types
Und reference types
..
Bearbeiten:Hier ist ein Beispiel einer Klasse unten, die erklärt, warum ich überschreiben müsste Equals
:
public class Laptop : LaptopBase
{
public readonly string Make;
public readonly string ProcessorArch;
public readonly int MemorySupported;
public readonly int HardDiskGBSupported;
public readonly Color ColorName;
public Laptop(make, procArch, memorySupp, hdGB, color)
{
Make = make;
ProcessorArch = procArch;
MemorySupported = memorySupp;
HardDiskGBSupported = hdGB;
ColorName = color;
}
}
Jetzt möchte ich für zwei Laptop-Instanzen „true“ zurückgeben, bei denen alle oben definierten Felder miteinander übereinstimmen, sodass das überschrieben werden muss Equals
Und GetHashCode
Methode und eine weitere Anforderung, wie Sie sehen, ist, dass es sich um eine abgeleitete Klasse handelt, die weiterverwendet werden kann und eine Reihe von Methoden unterstützt.und kann daher nicht zu einem Werttyp (Struktur) gemacht werden.Ich habe es mit 2 Instanzen des oben genannten Typs mit allen passenden Instanzfeldern versucht und wenn ich die Basisimplementierung von verwende Equals
- es kehrt zurück false
wo ich es haben möchte true
..
Wie würde ich ein solches Szenario unterstützen?
Lösung
Es hängt vom Typ ab, auf dem es implementiert wird, aber es sollte eine gute Streuung der Werte ermöglichen und es ist KEIN Muss, dass GetHashCode() eindeutige Werte zurückgibt.Es sollte auf den Feldern basieren, die in Ihrer Equals-Implementierung verwendet werden, und diese Felder sollten unveränderlich sein.Daher sind die Anforderungen für Equals/GetHashCode für Strukturen und Klassen dieselben.
Und wie Henk sagte, ist es besser, Equals/GetHashCode überhaupt nicht zu überschreiben ...