I have had many occasions when I need access to a decent hash algorithm in C #, from overriding GetHashCode to performing quick comparisons / data searches.
I found the FNV hash to be a very simple / good / fast 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 the class, I do 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 about this?
Keith
source share