User.ID和Group.ID都是Int16且不可变的,我想生成一个最佳的HashCode。
这是平等
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
UserGroup item = (UserGroup)obj;
return (User.ID == item.User.ID && Group.ID == item.Group.ID);
}
什么是最佳的GetHashCode。现在我正在使用以下内容,但仅仅因为我将其视为一个例子。 Object的主要用途是在HashSet中,并且HashSet获得了很多.Select(x => x.User.ID = y)或.Select(x => x.Group.ID = y)。
public override int GetHashCode() { return (int)User.ID ^ (int)Group.ID; }
答案 0 :(得分:1)
永远不要跳过生成完美哈希的机会。两个16位短路适合32位int:
public override int GetHashCode() {
return (User.ID & 0xffff) + (Group.ID << 16);
}
表达式的第一部分隔离了低16位,&amp;运算符必须使其适用于负值,因此只使用位0到15。第二部分将Group.ID的16位移动到位位置16到31.添加它们将两组16位组合成一个32位数字。
答案 1 :(得分:0)
嗯,实际上,如果你想要好的散列分布,那么两者都不是首选(只有一个例子:使用你的实现,User.ID = 10,Group.ID = 5将散列到与User.ID = 5,Group相同的值。 ID = 10)。当然,它是可用的,但请看看the master对此有何看法。