简体   繁体   English

C#实现FNV哈希

[英]C# implementation of FNV Hash

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. 我有很多情况需要在C#中访问一个体面的哈希算法,从覆盖GetHashCode到对数据进行快速比较/查找。

I have found the FNV hash to be a really easy/good/quick hash algorithm. 我发现FNV哈希是一个非常简单/好/快的哈希算法。 However, I have never seen a good example of a C# implementation. 但是,我从未见过一个C#实现的好例子。

The core of the FNV-1a hash algorithm is as follows: FNV-1a哈希算法的核心如下:

 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: 所以,当我为一个类覆盖GetHashCode ,我最终做了类似的事情:

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? 人们怎么想这个?

You could add this to your FNVConstants class 您可以将其添加到FNVConstants

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

Then call it like 然后把它称为

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM