C# GetHashCode() ad Alte Prestazioni Algoritmo di Hash [duplica]
-
11-12-2019 - |
Domanda
Possibile Duplicare:
Qual è il miglior algoritmo per un override del Sistema.Oggetto.GetHashCode?
Questo ci è noto che se ridefiniamo il Equals
metodo di Object
nel nostro tipi personalizzati, anche noi dovremmo ignorare e di fornire un'implementazione di GetHashCode
metodo per supportare la generazione di hash univoco codici per l'uso un supporto di Hashtable
e Dictionary
collezione di classi e possono essere altre classi.
Questa mandati nostra implementazione dell'algoritmo di hash utilizzato all'interno del nostro overriden
GetHashCode
il metodo è ottimale e preciso cioèesso genera un hash univoco del tipo e fa anche più rapidamente possibile per migliorare le prestazioni dell'applicazione che utilizza il nostro tipo.
La mia domanda è gli algoritmi di hashing che sono accurate e garantire prestazioni ottimali se usato in GetHashCode
attuazione?O, dovremmo utilizzare solo il tipo di base del GetHashCode
attuazione?Vorrei sapere questa risposta per entrambi value types
e reference types
..
Edit:Ecco un esempio di una classe sotto sul perché avrei bisogno di ignorare 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;
}
}
Ora, voglio restituire true per 2 Laptop istanze che sono tutti sopra i campi definiti dall'abbinamento con ogni altro, in modo che richiede di sovrascrivere l' Equals
e GetHashCode
metodo e anche un altro requisito, come si può vedere è che questa è una classe derivata e può essere ri-utilizzato e il supporto di un certo numero di metodi;e, quindi, non può essere fatta di un tipo di valore (struct).Ho provato con 2 istanze di tipo di cui sopra, con tutti i corrispondenti campi di istanza e se io uso l'implementazione di base di Equals
- si restituisce false
dove voglio essere true
..
Come faccio a sostenere un tale scenario?
Soluzione
Dipende di che tipo è implementato, ma dovrebbe dare una buona dispersione di valori e NON è un must per GetHashCode() per restituire un unico valore.Si dovrebbe basare su quei campi che vengono utilizzati nell'implementazione di Equals e i campi devono essere immutabili.Quindi i requisiti per Uguale/GetHashCode sono le stesse per le strutture e le classi.
E come Henk ha detto, è meglio non eseguire l'override di Equals/GetHashCode a tutti...