Скажем, у меня есть объект, который хранит массив байтов, и я хочу иметь возможность эффективно генерировать хэш-код для него. Я использовал криптографические хеш-функции для этого в прошлом, потому что их легко реализовать, но они делают гораздо больше работы, чем должны быть криптографически в ожидании, и мне это неинтересно (я просто использую хэш-код в качестве ключа в хэш-таблицу).
Вот что у меня сегодня:
struct SomeData : IEquatable<SomeData>
{
    private readonly byte[] data;
    public SomeData(byte[] data)
    {
        if (null == data || data.Length <= 0)
        {
            throw new ArgumentException("data");
        }
        this.data = new byte[data.Length];
        Array.Copy(data, this.data, data.Length);
    }
    public override bool Equals(object obj)
    {
        return obj is SomeData && Equals((SomeData)obj);
    }
    public bool Equals(SomeData other)
    {
        if (other.data.Length != data.Length)
        {
            return false;
        }
        for (int i = 0; i < data.Length; ++i)
        {
            if (data[i] != other.data[i])
            {
                return false;
            }
        }
        return true;
    }
    public override int GetHashCode()
    {
        return BitConverter.ToInt32(new MD5CryptoServiceProvider().ComputeHash(data), 0);
    }
}
Любые мысли?
dp: Вы правы, что я пропустил чек в Equals, я его обновил. Использование существующего хэш-кода из массива байтов приведет к эталонному равенству (или, по крайней мере, такому же понятию, переведенному в хэш-коды). например:
byte[] b1 = new byte[] { 1 };
byte[] b2 = new byte[] { 1 };
int h1 = b1.GetHashCode();
int h2 = b2.GetHashCode();
С помощью этого кода, несмотря на то, что два массива байтов имеют одинаковые значения внутри них, они относятся к разным частям памяти и приведут (возможно) к другим хэш-кодам. Мне нужны хэш-коды для двух байтовых массивов с одинаковым содержимым.