Say I have an object that stores a byte array and I want to be able to efficiently generate a hashcode for it. I've used the cryptographic hash functions for this in the past because they are easy to implement, but they are doing a lot more work than they should to be cryptographically oneway and I don't care about that (I'm just using the hashcode as a key into a hashtable).
Here's what I have today:
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); }
}
Any thoughts?