使用增量数作为GetHashCode返回值

时间:2013-12-03 12:04:31

标签: c# hash unique

我想让一个具有唯一ID的班级X的每个实例 我是用递增的数字来做的:

class X {
    private int id;
    private static int instanceCounter = 0;

    public X() {
        id = Interlocked.Increment(ref instanceCounter);
    }

    //...
}

这些对象也被用作词典中的键,所以我想我可以从id返回GetHashCode()

    public override int GetHashCode() {
        return id;
    }

我知道Eric Lippert's post,但它总是讨论从存储在对象中的多个数据计算哈希值。
就我而言,唯一的“唯一”数据是id

所以问题是:
我有没有想过这种方法?

2 个答案:

答案 0 :(得分:4)

如果您希望每个对象都是不同的(因此不等于任何其他对象),那么根本不要覆盖EqualsGetHashCode。默认情况下是提供“可能唯一”的哈希代码,这就是缩小选择范围所需的全部内容 - Equals将使用引用标识,这就是您想要的。没有必要单独的id字段,只是为了平等。

如果您 因其他原因需要id字段,您当然可以从GetHashCode返回 - 我建议将其设为只读字段,以明确您的意图虽然。

请注意,哈希代码永远不应该用作明确的正等式检查 - 它们仅用于排除明确彼此相等的实例

答案 1 :(得分:2)

如果您只关心Equals()正常工作,可以覆盖GetHashCode,如

public override int GetHashCode() {
    return 0;
}

含义每次都必须调用Equals();这在逻辑上是很好的,但可能导致性能方面的问题(这将有效地使这个类的任何散列表具有检索复杂度O(n)而不是O(1));但是对于小清单(数十项),应该没问题。