我有一个只有一个字段的包装类,我想重写该包装类的 GetHashCode 方法。
我已经在存在多个字段的情况下编写了哈希代码算法(即使用异或、移位和换行等),但这是我第一次只使用单个字段。
1) 包装器及其字段是否应该返回相同的哈希码?我最初的想法是否定的,我们故意设计一个生成与另一个类相同的哈希值的类,这感觉不对。
2) 如果没有,获取字段的哈希码并加 1 就足够了,还是有更好的方法来计算新的哈希码?字段类本身有一个很好的算法来生成其哈希码。
最佳答案
正如您可能知道的那样,您应该覆盖 GetHashCode()
和Equals()
当您想要自定义类型的默认相等行为时,如在各种上下文中使用的,但包括基于哈希表的数据结构,如 HashSet<T>
和Dictionary<TKey, TValue>
.
执行此操作时需要遵循一些一般规则(最重要的是,如果您的类型的两个实例相等,则它们必须具有相同的哈希代码值),但这些规则都不涉及担心哈希值是否可能重合与某种其他类型的实例的值。事实上,如果哈希值与相同类型的实例的值一致,那么不一定是问题。自 GetHashCode()
返回一个 32 位整数,只有不超过 2^32 个可能值的类型甚至可以保证相同类型实例的唯一哈希值(例如 int
、 short
、 bool
等)。
例如,对于任何给定的 long
值(64位整数),有2^32-1 其他 long
具有相同哈希码的值。
这是一个很长的说法......只是作为您自己的类型的值返回 GetHashCode()
的简单实现方法,您的单个字段的值 GetHashCode()
方法返回,是实现您的 GetHashCode()
的完全可接受且有用的方法。方法。
确实,如果出于某种原因,您在同一数据结构中拥有所包含对象类型的实例和您自己对象类型的实例,则会发生冲突(即,两个不同的实例具有相同的哈希码)值(value))。但由于在处理哈希码时无论如何都会发生冲突,所以这不是问题。
关于c# - 具有单个字段的包装类的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933629/