Heim > Artikel > Backend-Entwicklung > So implementieren Sie C# GetHashCode
In Projekten müssen Sie bei der Verwendung von Hash-Tabellen manchmal GetHashCode überschreiben. Hier ist ein gängiger Ansatz:
Version 1:
Implementieren Sie einen Helfer, übergeben Sie Typ T und geben Sie den Hashcode dieses Typs zurück. Die Funktionslogik ist sehr einfach, sie führt lediglich eine Nullprüfung durch; wenn obj nicht leer ist, wird der Hash-Code von obj direkt verwendet.
public class HashHelper { private int _seed = 17; public int Hash<T>(T obj) { // why 31? // http://www.php.cn/ // shortly, to reduce the conflict of hashing key's distrabution return 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode()); } }
Warum die magische Zahl 31 verwenden? für Compiler-Optimierungszwecke (effektiv konvertiert in i<<5-1). Nach einiger Suche stammt diese Implementierungsmethode aus der Hash-Code-Funktion von string in JAVA. Hier ist eine detaillierte Einführung:
https://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
Implementierungsversion 2:
kann Diese Klasse wird zu einer fließenden Schnittstelle, die verschiedene Typen hashen kann. Die Bedeutung der Überladung besteht darin, das Boxen für Sammlungen oder Generika zu reduzieren und externe Aufrufe natürlicher und lesbarer zu machen.
public class HashFluent { private int _seed = 17; private int _hashContext; public HashFluent Hash<T>(T obj) { // why 31? // http://www.php.cn/ // shortly, to reduce the conflict of hashing key's distrabution _hashContext = 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode()); return this; } public HashFluent Hash(int? value) { _hashContext = 31 * _seed + ((value == null) ? -1 : value.GetHashCode()); return this; } public HashFluent Hash(IEnumerable sequence) { if (sequence == null) { _hashContext = 31 * _hashContext + -1; } else { foreach (var element in sequence) { _hashContext = 31 * _hashContext + ((element == null) ? -1 : element.GetHashCode()); } } return this; } public override int GetHashCode (){ return _hashContext; } // add more overridings here .. // add value types overridings to avoid boxing which is important }
Das Obige ist der Inhalt der C#-GetHashCode-Implementierung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!