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'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'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) !