說我有一個對象,存儲一個字節數組,我希望能夠有效地爲它生成一個哈希碼。我過去使用過密碼散列函數,因爲它們很容易實現,但是它們做的工作要比單純使用密碼技術要多得多,我不在乎這一點(我只是在使用散列碼作爲散列表中的關鍵字)。如何從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