假设我有一个存储字节数组的对象,我希望能够有效地为其生成哈希码。我过去曾为此使用过加密哈希函数,因为它们易于实现,但它们所做的工作比单向加密要多得多,我不在乎(我只是使用哈希码作为哈希表的键)。
这是我今天所拥有的:
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();
使用该代码,尽管两个字节数组在其中具有相同的值,但它们指的是内存的不同部分,并会导致(可能)不同的哈希码。我需要具有相同内容的两个字节数组的哈希码相等。