Скажем, у меня есть объект, который хранит массив байтов, и я хочу иметь возможность эффективно генерировать хэш-код для него. Я использовал криптографические хеш-функции для этого в прошлом, потому что их легко реализовать, но они делают гораздо больше работы, чем должны быть криптографически в ожидании, и мне это неинтересно (я просто использую хэш-код в качестве ключа в хэш-таблицу).
Вот что у меня сегодня:
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();
С помощью этого кода, несмотря на то, что два массива байтов имеют одинаковые значения внутри них, они относятся к разным частям памяти и приведут (возможно) к другим хэш-кодам. Мне нужны хэш-коды для двух байтовых массивов с одинаковым содержимым.