Domanda

Come molti di voi, utilizzo ReSharper per accelerare il processo di sviluppo. Quando lo usi per sovrascrivere i membri di uguaglianza di una classe, il code-gen che produce per GetHashCode () appare come:

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Key != null ? Key.GetHashCode() : 0);
            result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
            result = (result * 397) ^ ObjectId;
            return result;
        }
    }

Naturalmente ho alcuni dei miei membri lì dentro, ma quello che voglio sapere è perché 397?

  • MODIFICA: Quindi la mia domanda sarebbe meglio formulata in quanto, c'è qualcosa di "speciale" nel fatto che il numero primo 397 al di fuori di esso sia un numero primo?
È stato utile?

Soluzione

Probabilmente perché 397 è un numero primo di dimensioni sufficienti per causare l'overflow della variabile risultato e mescolare in qualche modo i bit dell'hash, fornendo una migliore distribuzione dei codici hash. Non c'è nulla di particolarmente speciale nel 397 che lo distingue dagli altri numeri primi della stessa grandezza.

Altri suggerimenti

Ben ha ragione, riflettendo l'Assemblea puoi vedere che è solo un numero primo che hanno scelto di usare.

L'hash utilizzato da Resharper sembra una variante del FNV hash. FNV è spesso implementato con numeri primi diversi. C'è una discussione sulla scelta appropriata di numeri primi per FNV qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top