c# - 使用增量数字作为 GetHashCode 返回值

标签 c# hash unique

我想让类 X 的每个实例都有一个唯一的 ID。
我正在使用递增的数字来执行此操作:

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

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

    //...
}

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

    public override int GetHashCode() {
        return id;
    }

我知道 Eric Lippert's post ,但它总是谈论从存储在对象中的多个数据计算散列。
在我的例子中,唯一的“唯一”数据是 id

那么问题是:
这种方法有什么我没有考虑过的吗?

最佳答案

如果您希望每个对象都不同(因此不等于任何其他对象),那么根本不要覆盖 EqualsGetHashCode。默认设置是提供一个“可能唯一”的哈希码,这是缩小选择范围所需的全部 - Equals 将使用引用身份,这正是您想要的。不需要单独的 id 字段,只是为了相等。

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

请注意,哈希码无论如何都不应该用作明确肯定的相等性检查 - 它们仅用于排除绝对彼此相等的实例.

关于c# - 使用增量数字作为 GetHashCode 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350702/

相关文章:

c# - 向所有查询 Entity Framework 添加过滤器

c# - 字符串未被识别为 IIS 上的有效日期时间错误

c++ - 剔除 vector 中的重复条目

java - 我可以在 Java 中将对象字段标记为唯一吗

c# - 找不到 Android 文本文件

C#:将 http://www.google.com 转换为 google.com

ruby-on-rails - Rails Strong Parameters - 允许数组中的深层嵌套哈希

php - Crypt() 函数的河豚盐长度?

c# - 反转哈希函数

MySQL SELECT 列,其中两列都是唯一的