Maison >développement back-end >Tutoriel C#.Net >Comment implémenter C# GetHashCode

Comment implémenter C# GetHashCode

黄舟
黄舟original
2017-02-28 11:46:552128parcourir

Dans les projets, lorsque vous utilisez des tables de hachage, vous devez parfois remplacer GetHashCode. Voici une approche courante :

Version 1 :
Implémentez un assistant, transmettez le type T et renvoyez le hashcode de ce type. La logique de la fonction est très simple, elle effectue simplement une vérification nulle ; si obj n'est pas vide, le code de hachage de obj est utilisé directement.

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());
	}
}


Pourquoi utiliser le nombre magique 31 ? L'utilisation d'un produit de nombre premier peut relativement augmenter l'unicité et réduire les conflits dans l'allocation de valeur de clé de hachage alors que 31 est C'est le cas ; à des fins d'optimisation du compilateur (efficacement converti en i<<5-1). Après quelques recherches, cette méthode d'implémentation provient de la fonction de code de hachage de string en JAVA. Voici une introduction détaillée :
https://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
Implementation version 2 :
peut être étendu Cette classe devient une interface fluide, qui peut hacher différents types, pour les types valeur, l'importance de la surcharge est de réduire le boxing ; pour les collections ou les génériques, il s'agit de rendre les appels externes plus naturels et plus lisibles.

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
}

Ce qui précède est le contenu de l'implémentation de C# GetHashCode. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn