Byte Array Comparer Class
Updated: Dec-22,2020
Updated: May-04,2021
using System;
using System.Collections.Generic;
[Serializable]
public class ArrayComparer : IEqualityComparer<byte[]>
{
private const ulong M = 0x10000000;
public bool Equals(byte[] x, byte[] y)
{
if (x == null || y == null)
return false;
if (x.Length != y.Length)
return false;
return x.Compare(y);
}
public unsafe int GetHashCode(byte[] obj)
{
var cbSize = obj.Length;
var hash = 0x811C9DC5;
fixed (byte* pb = obj)
{
var nb = pb;
while (cbSize >= 4)
{
hash ^= *(uint*) nb;
hash *= 0x1000193;
hash %= 0x10000000;
nb += 4;
cbSize -= 4;
}
switch (cbSize & 3)
{
case 3:
hash ^= *(uint*) (nb + 2);
hash *= 0x1000193;
hash %= 0x10000000;
goto case 2;
case 2:
hash ^= *(uint*) (nb + 1);
hash *= 0x1000193;
hash %= 0x10000000;
goto case 1;
case 1:
hash ^= *nb;
hash *= 0x1000193;
hash %= 0x10000000;
break;
}
}
return (int) hash;
}
}