具有单个字段的包装器 class 的哈希码
Hash code for a wrapper class with a single field
我有一个只有一个字段的包装器 class,我想覆盖包装器 class.
的 GetHashCode 方法
我在有多个字段的情况下编写了哈希码算法(即使用 xor、shift-and-wrap 等),但这是我第一次只有一个字段可以使用.
1) 包装器及其字段 return 是否应具有相同的哈希码?我最初的想法是否定的,我们故意设计一个生成与另一个 class.
相同的散列的 class 感觉不对
2) 如果不是,获取字段的哈希码并向其加 1 就足够了吗?或者是否有更好的方法来计算新的哈希码?字段 class 本身有一个很好的算法来生成它的哈希码。
正如您可能知道的那样,当您想要自定义类型的默认相等行为时,您应该覆盖 GetHashCode()
和 Equals()
,如在各种上下文中使用的,但包括 hash-[=基于 42=] 的数据结构,如 HashSet<T>
和 Dictionary<TKey, TValue>
.
执行此操作时需要遵循一些通用规则(最重要的是,如果您的类型相同的两个实例,它们必须具有相同的哈希码值),但是这些规则中的 none 涉及担心哈希值是否可能与其他类型实例的值一致。实际上,如果散列值与 相同 类型的实例的值一致,这甚至 不一定 是个问题。由于 GetHashCode()
returns 是一个 32 位整数,只有不超过 2^32 个可能值的类型甚至可以保证相同类型实例的唯一哈希值(例如 int
, short
、bool
等)。
例如,对于任何给定的 long
值(64 位整数),有 2^32-1 other long
个值具有相同的哈希码。
这是一个很长的说法......只是作为你自己的类型的值返回它的 GetHashCode()
方法的简单实现,你的单个字段的 GetHashCode()
方法 returns 的值, 是实现 GetHashCode()
方法的完美接受table 和有用的方法。
的确,如果出于某种原因您在同一数据结构中拥有包含对象类型的实例和您自己对象类型的实例,则会发生冲突(即两个不同的实例具有相同的哈希码值)。但是由于在处理哈希码时无论如何都会发生冲突,所以这不是问题。
我有一个只有一个字段的包装器 class,我想覆盖包装器 class.
的 GetHashCode 方法我在有多个字段的情况下编写了哈希码算法(即使用 xor、shift-and-wrap 等),但这是我第一次只有一个字段可以使用.
1) 包装器及其字段 return 是否应具有相同的哈希码?我最初的想法是否定的,我们故意设计一个生成与另一个 class.
相同的散列的 class 感觉不对2) 如果不是,获取字段的哈希码并向其加 1 就足够了吗?或者是否有更好的方法来计算新的哈希码?字段 class 本身有一个很好的算法来生成它的哈希码。
正如您可能知道的那样,当您想要自定义类型的默认相等行为时,您应该覆盖 GetHashCode()
和 Equals()
,如在各种上下文中使用的,但包括 hash-[=基于 42=] 的数据结构,如 HashSet<T>
和 Dictionary<TKey, TValue>
.
执行此操作时需要遵循一些通用规则(最重要的是,如果您的类型相同的两个实例,它们必须具有相同的哈希码值),但是这些规则中的 none 涉及担心哈希值是否可能与其他类型实例的值一致。实际上,如果散列值与 相同 类型的实例的值一致,这甚至 不一定 是个问题。由于 GetHashCode()
returns 是一个 32 位整数,只有不超过 2^32 个可能值的类型甚至可以保证相同类型实例的唯一哈希值(例如 int
, short
、bool
等)。
例如,对于任何给定的 long
值(64 位整数),有 2^32-1 other long
个值具有相同的哈希码。
这是一个很长的说法......只是作为你自己的类型的值返回它的 GetHashCode()
方法的简单实现,你的单个字段的 GetHashCode()
方法 returns 的值, 是实现 GetHashCode()
方法的完美接受table 和有用的方法。
的确,如果出于某种原因您在同一数据结构中拥有包含对象类型的实例和您自己对象类型的实例,则会发生冲突(即两个不同的实例具有相同的哈希码值)。但是由于在处理哈希码时无论如何都会发生冲突,所以这不是问题。