C# реализация хэша FNV

у меня было много случаев, когда мне нужен доступ к достойному алгоритму хэширования в C#, от переопределения GetHashCode для выполнения быстрого сравнения/поиска данных.

я обнаружил, что хэш 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;
}

что люди думают об этом?

1 ответов


вы можете добавить это в свой 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);
}