用于对象识别的XOR

时间:2013-09-25 18:32:58

标签: c# algorithm bitwise-operators boolean-logic monocross

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

  1. MXViewPerspective对象PerspectiveModelType成员的按位XOR是否用于唯一标识实例?

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


  3. 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);
        }
    }
    

    谢谢。

1 个答案:

答案 0 :(得分:3)

xor'ing哈希码不保证唯一性,但通常用于改善表的分布而不会使哈希复杂化。

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

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