title: C# implementation of FNV Hash
body: <p>I have had numerous cases where I need access to a decent hashing algorithm in C#, from overriding <code>GetHashCode</code> to performing quick comparisons/lookups against data.</p>
  
  <p>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.</p>
  
  <p>The core of the FNV-1a hash algorithm is as follows:</p>
  
  <pre><code> hash = OFFSET_BASIS
   foreach (object value in object) 
   {
       hash = hash ^ value.GetHashCode()
       hash = hash * FNV_PRIME
   }
  </code></pre>
  
  <p>So, when I override <code>GetHashCode</code> for a class I end up doing something like:</p>
  
  <pre><code>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;
  }
  </code></pre>
  
  <p>What do people think of this? </p>