C # FNV Hash Implementation

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?

+7
source share
1 answer

You can add this to your FNVConstants class.

 public static int CreateHash(params object[] objs) { return objs.Aggregate(OffsetBasis, (r, o) => (r ^ o.GetHashCode()) * Prime); } 

Then name it like

 public override int GetHashCode() { return FNVConstants.CreateHash(EntityId, FromDate, ToDate); } 
+7
source

All Articles