9

GetHashCodeオーバーライドからデータに対する迅速な比較/検索の実行まで、C# で適切なハッシュ アルゴリズムにアクセスする必要があるケースが数多くあります。

FNV ハッシュは、非常に簡単で優れた迅速なハッシュ アルゴリズムであることがわかりました。ただし、C# 実装の良い例を見たことがありません。

FNV-1a ハッシュ アルゴリズムのコアは次のとおりです。

 hash = OFFSET_BASIS
 foreach (object value in object) 
 {
     hash = hash ^ value.GetHashCode()
     hash = hash * FNV_PRIME
 }

したがって、クラスをオーバーライド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;
}

人々はこれについてどう思いますか?

4

1 に答える 1

7

FNVConstantsこれをクラスに追加できます

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

それからそれを次のように呼びます

public override int GetHashCode()
{
    return FNVConstants.CreateHash(EntityId, FromDate, ToDate);
}
于 2012-12-20T14:45:47.783 に答える