Ho avuto numerosi casi in cui ho bisogno di accedere ad un algoritmo di hashing decente in C#, dall'overriding GetHashCode
all'esecuzione di confronti rapidi/ricerche sui dati.Implementazione C# di FNV Hash
Ho trovato che l'hash FNV è un algoritmo hash veramente facile/buono/veloce. Tuttavia, non ho mai visto un buon esempio di implementazione C#.
Il nucleo della algoritmo di hash FNV-1a è la seguente:
hash = OFFSET_BASIS
foreach (object value in object)
{
hash = hash^value.GetHashCode()
hash = hash * FNV_PRIME
}
Così, quando sovrascrivo GetHashCode
per una classe finisco per fare qualcosa di simile:
public static class FNVConstants
{
public static readonly int OffsetBasis = unchecked((int)2166136261);
public static readonly int Prime = 16777619;
}
public override int GetHashCode()
{
int hash = Constants.FNVConstants.OffsetBasis;
hash = (hash^EntityId.GetHashCode()) * Constants.FNVConstants.Prime;
hash = (hash^FromDate.GetHashCode()) * Constants.FNVConstants.Prime;
hash = (hash^ToDate.GetHashCode()) * Constants.FNVConstants.Prime;
return hash;
}
Che cosa la gente pensa a questo?
Si guarda bene a me ... si shoudl proprio vicino 'hash^x' tra parentesi - per esempio '(hash^x) * primo' - altrimenti la moltiplicazione verrà eseguita per prima. – digEmAll