输入为两个Int16时覆盖GetHashCode

时间:2012-04-01 15:10:56

标签: .net hashcode

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; }

2 个答案:

答案 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对此有何看法。