2010-05-22 14 views

risposta

34

Il requisito minimo è che il codice hash dovrebbe essere lo stesso per qualsiasi valore specificato. Quindi, questa implementazione funziona, ma la distribuzione è orribile:

public override int GetHashCode() { 
    return 1; 
} 

Per funzionare al meglio, i codici hash dovrebbe prendere in considerazione tutti i dati rilevanti in oggetto ed essere distribuita più uniformemente possibile entro il campo intero.

Un'implementazione che considera tutti i membri, ma non fornisce una distribuzione molto buona, può essere trovata nella struttura System.Drawing.Point. Esso utilizza XOR combinare i bit nei membri, il che significa che tutti i punti in cui X e Y sono uguali ottenere il codice hash di zero:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

Un modo per ottenere una migliore distribuzione è di moltiplicare un membro da un primo numero e aggiungere l'elemento successivo, ripetendo come necessario:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

lo stesso metodo è stato utilizzato in semplici generatori casuali, in quanto disperde i valori abbastanza bene.

+0

Alcuni punti davvero buoni lì. Grazie! – dotnetdev

Problemi correlati