ByteArray
内部でバイト配列を使用する独自の不変クラスを作成しながら、IStructuralEquatable
インターフェイスを実装しました。私の実装では、ハッシュコードを計算するタスクを内部配列に委任しました。テスト中に、驚いたことに、2つの異なる配列が同じ構造ハッシュコードを持っていることがわかりました。つまり、から同じ値を返しましたGetHashCode
。再現するには:
IStructuralEquatable array11 = new int[] { 1, 1 };
IStructuralEquatable array12 = new int[] { 1, 2 };
IStructuralEquatable array22 = new int[] { 2, 2 };
var comparer = EqualityComparer<int>.Default;
Console.WriteLine(array11.GetHashCode(comparer)); // 32
Console.WriteLine(array12.GetHashCode(comparer)); // 32
Console.WriteLine(array22.GetHashCode(comparer)); // 64
IStructuralEquatable
は非常に新しく未知ですが、コレクションと配列の内容を比較するために使用できることをどこかで読みました。私は間違っていますか、それとも私の.Netは間違っていますか?
私が話しているのではないObject.GetHashCode
ことに注意してください!
編集:それで、等しくないオブジェクトは等しいハッシュコードを持っているかもしれないので、私は明らかに間違っています。しかしGetHashCode
、いくらかランダムに分散された値のセットを返すことは要件ではありませんか?さらにテストを行った結果、最初の要素が同じ2つの配列のハッシュが同じであることがわかりました。私はまだこれは奇妙な行動だと思います。