2012-05-22 9 views
5

Ha qualche significato speciale quando la funzione GetHashCode() restituisce qualcosa utilizzando il codice che contains^symbol?GetHashCode() con^

public class ClassProp 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public int Prop4 { get; set; } 
    public int Prop5 { get; set; } 

    public override int GetHashCode() 
    { 
     return Prop1.GetHashCode()^Prop2.GetHashCode()^
       Prop3.GetHashCode()^Prop4.GetHashCode()^Prop5.GetHashCode(); 
    } 
} 
+0

Molte risposte hanno indicato che è l'operatore XOR. È usato qui solo per creare un hashcode combinato. Dai un'occhiata a questo post qui su SO: http://stackoverflow.com/questions/1079192/is-it-possible-to-combine-hash-codes-for-private-members-to-generate-a-new- hash –

risposta

4

Questo è solo il bitwise xor operator. Viene spesso utilizzato per combinare codici hash di oggetti diversi in un singolo codice hash globale.

Non è una delle cose più facili da cercare su Google! Il mio consiglio durante la ricerca di tali cose è guardare lo table of all operators.

+0

puoi condividere un semplice esempio reale per capire quando utilizzare la funzione GetHashCode() nel progetto di vita reale? – Nilish

+0

Generalmente non si chiama molto 'GetHashCode'. Ma il framework lo usa per test di uguaglianza, hashing del dizionario, ecc. Per lo più si può cavarsela affidandosi all'implementazione predefinita. –

+0

Stai parlando di questo 'public override bool Equals (Object obj) {}'? Se è così, qual è la relazione tra questi due? – Nilish

4

^ è il C# XOR operator. Niente di "speciale" al riguardo, solo che i codici hash di tutte le proprietà della classe sono XOR insieme.

Modifica: GetHashCode restituisce un codice generico che viene utilizzato come identificatore di una stenografia per un oggetto complesso. Un uso comune è nelle strutture di dati hashing quando si desidera archiviare oggetti e quindi recuperarli rapidamente in base al loro codice hash. Assumere una classe Person e alcuni oggetti con i corrispondenti codici hash:

Alex 8540 
John 9435 
Peter 2453 

Questi codici vengono generati sulla base alcuni o tutti i campi di ogni oggetto e devono toccarsi il meno possibile garantire hashing efficiente. Ora possiamo memorizzare gli oggetti in una tabella hash utilizzando il codice hash:

Entries 
0 -> Alex 
1 -> John 
2 -> Peter 

Gli oggetti vengono memorizzati all'interno della tabella utilizzando i rispettivi codici hash per determinare la posizione. Successivamente possono essere facilmente recuperati utilizzando lo stesso codice hash.

Ti suggerisco di trovare della letteratura su come funzionano le tabelle hash, perché è un po 'troppo da spiegare in un post SO.

+0

puoi condividere un semplice esempio reale per capire quando utilizzare la funzione GetHashCode() nel progetto di vita reale? – Nilish

+0

@ Kanav: vedere la mia modifica. – Tudor

+0

Hai un articolo molto semplice (un link) nel tuo dizionario? – Nilish

0

L'operatore binario XOR funziona come segue:

A = 10111 B = 01010

A^B = 11101

vari bit correspoding resutl in 1, quelli analoghi risultato in 0.

Nel tuo caso, questi numeri interi vengono convertiti prima in binario e quindi elaborati come nell'esempio precedente.

2

Questo è il bitwize XOR operator.

Questo è un operatore molto comune utilizzato durante l'implementazione di GetHashCode.

Ciò detto, in questo caso, l'implementazione potrebbe non essere l'ideale. Il problema con l'uso di XOR (da solo) è che non stai necessariamente riducendo le possibilità di collisioni.Il problema è che una classe definita in questo modo:

class Foo 
{ 
    public int Bar { get; set; } 
    public int Baz { get; set; } 

    // ... 
    public override int GetHashCode() 
    { return this.Bar.GetHashCode()^this.Baz.GetHashCode(); } 
} 

sta per creare lo stesso codice hash quando Bar == 2 e Baz == 4 come quando Bar == 4 e Baz == 2. A seconda del caso d'uso, questo può portare a più collisioni di hash, quindi è qualcosa di cui essere a conoscenza quando si implementa GetHashCode. Inoltre, dovresti stare molto attento quando crei un tipo mutabile come questo che l'implementazione del codice hash corrisponda ai controlli di uguaglianza, ecc.

+1

puoi condividere un semplice esempio reale per capire quando utilizzare la funzione GetHashCode() nel progetto di vita reale? – Nilish

Problemi correlati