I have had numerous cases where I need access to a decent hashing algorithm in C#, from overriding GetHashCode
to performing quick comparisons/lookups against data.
I have found the FNV hash to be a really easy/good/quick hash algorithm. However, I have never seen a good example of a C# implementation.
The core of the FNV-1a hash algorithm is as follows:
hash = OFFSET_BASIS
foreach (object value in object)
{
hash = hash ^ value.GetHashCode()
hash = hash * FNV_PRIME
}
So, when I override GetHashCode
for a class I end up doing something like:
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;
}
What do people think of this?
hash ^ x
in brackets - e.g.(hash ^ x) * prime
- otherwise the multiplication will be performed first. – SottedHashCode.Combine(EntityId, FromDate, ToDate)
. – AekerlyGetHashCode
by combining the hash codes of several properties. This is exactly whatHashCode.Combine
does, without having to worry about the implementation. – Aekerly