1

在下面的代码中,我想知道为什么使用 XOR (^) 来组合组合的组成成员的 hascode(这是来自 MonoCross 1.3 的源代码)?

  1. MXViewPerspective对象Perspective和成员的按位异或是否ModelType用于唯一标识实例?

  2. 如果是这样,XOR 操作的这个属性是否有一个名称(XOR-ing 两个值(即哈希码)如何保证唯一性)?


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'ing hashcodes 不保证唯一性,但通常用于改进表上的分布而不会使散列复杂化。

如果它们在任何字段中不同(即 - same ModelType, but different Perspective,反之亦然),您希望将 2 个不同的值映射到不同的哈希键。因此,您需要将这两个值合并到您的哈希键中。例如,您可以使用+它们,或者移位并连接它们(实际上后者会更好,因为它可以保证唯一性,但也可以扩展密钥长度,这可能会使散列复杂化)。

xor 不能保证这种唯一性,因为如果你在 and 中翻转相同的位ModelTypePerspective你会得到相同的哈希键,例如 5 ^ 7 = 1 ^ 3 = 2,但它通常已经足够好了。最终,这一切都取决于您提供的值的范围和分布。

于 2013-09-25T18:45:29.920 回答