说我有一个对象,存储一个字节数组,我希望能够有效地为它生成一个哈希码。我过去使用过密码散列函数,因为它们很容易实现,但是它们做的工作要比单纯使用密码技术要多得多,我不在乎这一点(我只是在使用散列码作为散列表中的关键字)。如何从C#中的字节数组生成哈希码?
这里就是我今天有:
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();
与该代码,尽管有在其中相同的值的两个字节数组,它们指的是存储器的不同部分,并且将导致在(可能)不同的散列码。我需要相同内容的两个字节数组的哈希码相等。
+1这是我听过的最清晰的解释之一,为什么覆盖Equals *和* GetHashcode是有益的。 – 2009-05-04 15:57:33