在下面的代码中,我想知道为什么XOR(^)被用来组合组成成分的hascodes(这是来自MonoCross 1.3的源代码)?
MXViewPerspective
对象Perspective
和ModelType
成员的按位XOR是否用于唯一标识实例?
如果是这样,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);
}
}
谢谢。
答案 0 :(得分:3)
xor'ing哈希码不保证唯一性,但通常用于改善表的分布而不会使哈希复杂化。
如果它们在任何字段中不同(例如 - 相同ModelType
,但不同Perspective
,或反之亦然),您希望将2个不同的值映射到不同的散列键。因此,您需要将两个值合并到哈希键中。例如,您可以使用+
,或者转换并连接它们(事实上后者会更好,因为会保证唯一性,但也会延长可能使哈希变得复杂的密钥长度) 。
xor不保证这种唯一性,因为如果你在ModelType
和Perspective
中翻转相同的位,你会得到相同的哈希键,例如5 ^ 7 = 1 ^ 3 = 2 ,但通常都足够好。最终,这一切都取决于您提供的值的范围和分布。