C# 具有单个字段的包装器类的哈希代码

C# 具有单个字段的包装器类的哈希代码,c#,hash,wrapper,hashcode,C#,Hash,Wrapper,Hashcode,我有一个只包含一个字段的包装器类,我想覆盖包装器类的GetHashCode方法 我曾在有多个字段的情况下编写过哈希代码算法(即使用xor、shift和wrap等),但这是我第一次只处理一个字段 1) 包装器及其字段是否应返回相同的哈希代码?我最初的想法是不,我们只是觉得不应该故意设计一个类来生成与另一个类相同的哈希 2) 如果不是,那么获取字段的hashcode并向其中添加1就足够了,还是有更好的方法来计算新的hashcode?field类本身有一个很好的算法来生成其哈希代码。正如您可能知道的,

我有一个只包含一个字段的包装器类,我想覆盖包装器类的GetHashCode方法

我曾在有多个字段的情况下编写过哈希代码算法(即使用xor、shift和wrap等),但这是我第一次只处理一个字段

1) 包装器及其字段是否应返回相同的哈希代码?我最初的想法是不,我们只是觉得不应该故意设计一个类来生成与另一个类相同的哈希


2) 如果不是,那么获取字段的hashcode并向其中添加1就足够了,还是有更好的方法来计算新的hashcode?field类本身有一个很好的算法来生成其哈希代码。

正如您可能知道的,当您想要自定义类型的默认相等行为时,应该重写
GetHashCode()
Equals()
,用于各种上下文,但包括基于哈希表的数据结构,如
HashSet
Dictionary

执行此操作时,需要遵循一些一般规则(最重要的是,如果您的类型的两个实例相等,则它们必须具有相同的哈希代码值),但这些规则中没有一条涉及到担心哈希值是否与其他类型的实例的值一致。事实上,如果散列值与相同类型的实例的值重合,这甚至不一定是问题。由于
GetHashCode()
返回一个32位整数,因此只有可能值不超过2^32的类型才能保证同一类型实例的哈希值唯一(例如
int
short
bool
等)

例如,对于任何给定的
long
值(64位整数),有2^32-1个具有相同哈希代码的其他
long

这是一个很长的说法……只返回其
GetHashCode()
方法的类型值,即单个字段的
GetHashCode()
方法返回的值的简单实现,是实现
GetHashCode()
方法的一种完全可接受且有用的方法


确实,如果出于某种原因,您在同一数据结构中有一个包含对象类型的实例和一个您自己对象类型的实例,则会发生冲突(即,两个不同的实例具有相同的哈希代码值)。但是,由于在处理哈希代码时总会发生冲突,这不是问题。

我认为这个问题更适合“特别是因为两个类之间的equals方法是相同的”-为什么?看来你不希望它们相等,那么为什么不在其中添加一个类型检查呢?S_F,你是对的。存在类型检查,因此equals返回false。不知道我为什么加了那一点。我更关注的是哈希代码的生成,而不是equals方法。如果我没记错的话,Hashtable和Dictionary在查找给定的键等时都使用GetHashCode和equals,因此,如果后一种方法的实现在包装类及其字段的和实例之间进行了区分,那么它应该是正确的。当然,除非你自己的算法需要散列码,否则问题仍然存在。是的,你想得太多了。首先,如果要自定义类型的相等性检查,只需重写
GetHashCode()
(和
Equals()
…它们应该一起完成)。如果确实需要这样做,那么实现应该基于类型本身,而不考虑其他类型。为单个字段返回
GetHashCode()
值非常合适。无论如何,您永远不能保证两个不同类型的不同实例不会返回相同的哈希代码,就像您不能保证两个相同类型的实例一样(除了
int
等)