バイト配列を格納するオブジェクトがあり、そのハッシュコードを効率的に生成できるようにしたいとします。実装が簡単なので、過去にこれに暗号ハッシュ関数を使用しましたが、暗号学的に一方向にする必要があるよりもはるかに多くの作業を行っており、それについては気にしません (私は単にハッシュテーブルへのキーとしてのハッシュコード)。
ここに私が今日持っているものがあります:
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();
そのコードでは、2 つのバイト配列が同じ値を持っているにもかかわらず、メモリの異なる部分を参照しているため、(おそらく) 異なるハッシュ コードが生成されます。同じ内容の 2 つのバイト配列のハッシュ コードを等しくする必要があります。