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