1

以下のコードでは、なぜ XOR (^) を使用してコンポジションの構成メンバーのハッシュコードを結合しているのか疑問に思っていました (これは MonoCross 1.3 からのソースです)。

  1. インスタンスを一意に識別するために、MXViewPerspectiveオブジェクトPerspectiveとメンバーのビットごとの XOR が使用されていますか?ModelType

  2. もしそうなら、XOR 操作のこのプロパティの名前はありますか (2 つの値 (つまり、ハッシュコード) を XOR することで一意性が保証される方法) はありますか?


public class MXViewPerspective : IComparable
{
    public MXViewPerspective(Type modelType, string perspective)
    {
        this.Perspective = perspective;
        this.ModelType = modelType;
    }
    public string Perspective { get; set; }
    public Type ModelType { get; set; }

    public int CompareTo(object obj)
    {
        MXViewPerspective p =(MXViewPerspective)obj;
        return this.GetHashCode() == p.GetHashCode() ? 0 : -1;
    }
    public static bool operator ==(MXViewPerspective a, MXViewPerspective b)
    {
        return a.CompareTo(b) == 0;
    }
    public static bool operator !=(MXViewPerspective a, MXViewPerspective b)
    {
        return a.CompareTo(b) != 0;
    }
    public override bool Equals(object obj)
    {
        return this == (MXViewPerspective)obj;
    }
    public override int GetHashCode()
    {
        return this.ModelType.GetHashCode() ^ this.Perspective.GetHashCode();
    }

    public override string ToString()
    {
        return string.Format("Model \"{0}\" with perspective  \"{1}\"", ModelType, Perspective);
    }
}

ありがとうございました。

4

1 に答える 1

3

ハッシュコードを xor しても一意性は保証されませんが、通常、ハッシュを複雑にすることなくテーブルの分散を改善するために使用されます。

フィールドのいずれかが異なる場合、2 つの異なる値を異なるハッシュ キーにマップする必要があります (つまり、同じModelTypeであるが異なるPerspective、またはその逆)。したがって、両方の値をハッシュ キーに組み込む必要があります。+たとえば、それらをシフトして連結することもできます(後者は、一意性保証するだけでなく、ハッシュを複雑にする可能性のあるキーの長さを拡張するため、実際にはより良いでしょう)。

xor はこの一意性を保証しません。なぜなら、ModelTypeandPerspectiveで同じビットを反転すると、同じハッシュ キー (たとえば 5 ^ 7 = 1 ^ 3 = 2) が得られるからですが、通常はそれで十分です。最終的には、指定した値の範囲と分布にすべて依存します。

于 2013-09-25T18:45:29.920 に答える