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?