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