Question

Doublon possible :
Quel est le meilleur algorithme pour un System.Object.GetHashCode remplacé ?

Nous savons que si nous outrepassons le Equals méthode de Object dans nos types personnalisés, nous devrions également remplacer et fournir une implémentation de GetHashCode procédé pour prendre en charge la génération de codes de hachage uniques à utiliser pour prendre en charge Hashtable et Dictionary classes de collection et peut-être d’autres classes.

Cela nécessite notre implémentation de l'algorithme de hachage utilisé dans notre overriden GetHashCode la méthode est optimale et précise, c'est-à-direil génère un hachage unique du type et le fait également le plus rapidement possible pour améliorer les performances de l'application qui utilise notre type.

Ma question est de quels algorithmes de hachage sont précis et offrent des performances optimales lorsqu'ils sont utilisés dans GetHashCode mise en œuvre?Ou devrions-nous utiliser uniquement le type de base GetHashCode mise en œuvre?J'aimerais connaître cette réponse pour les deux value types et reference types..

Modifier:Voici un exemple de classe ci-dessous expliquant pourquoi je devrais remplacer 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;
    }
}

Maintenant, je souhaite renvoyer true pour 2 instances d'ordinateur portable dont tous les champs définis ci-dessus correspondent les uns aux autres, ce qui nécessite de remplacer le Equals et GetHashCode méthode et aussi une autre exigence, comme vous pouvez le voir, est qu'il s'agit d'une classe dérivée et qu'elle peut être réutilisée davantage et prendre en charge un certain nombre de méthodes ;et donc, ne peut pas être transformé en type valeur (struct).J'ai essayé avec 2 instances du type ci-dessus avec tous les champs d'instance correspondants et si j'utilise l'implémentation de base de Equals - ça revient false où je veux que ce soit true.. Comment pourrais-je soutenir un tel scénario ?

Était-ce utile?

La solution

Cela dépend du type sur lequel il est implémenté, mais cela devrait donner une bonne dispersion des valeurs et il n'est PAS obligatoire que GetHashCode() renvoie des valeurs uniques.Il doit être basé sur les champs utilisés dans votre implémentation Equals et ces champs doivent être immuables.Les exigences pour Equals/GetHashCode sont donc les mêmes pour les structures et les classes.

Et comme Henk l'a dit, il vaut mieux ne pas remplacer du tout Equals/GetHashCode...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top