Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie C# GetHashCode

So implementieren Sie C# GetHashCode

黄舟
黄舟Original
2017-02-28 11:46:552061Durchsuche

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&#39;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&#39;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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn