假设我有一个存储字节数组的对象,我想能够高效地为其生成哈希码。过去我用过加密哈希函数来实现这个目的,因为它们易于实现,但是它们执行了比必要的更多的工作以实现加密单向性,而我对此不关心(我只是将哈希码用作散列表中的键)。
以下是我目前拥有的:
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方法中漏掉了一个检查,已经进行了更新。使用字节数组的现有hashcode将导致引用相等性(或者至少是hashcode概念的相同转换)。例如:
byte[] b1 = new byte[] { 1 };
byte[] b2 = new byte[] { 1 };
int h1 = b1.GetHashCode();
int h2 = b2.GetHashCode();
尽管这段代码中的两个字节数组具有相同的值,但它们引用了内存中不同的部分,并且将生成(可能)不同的哈希码。我需要两个具有相同内容的字节数组的哈希码相等。