C# GetHashCode() 高性能哈希算法[重复]
-
11-12-2019 - |
题
我们知道,如果我们重写 Equals
的方法 Object
在我们的自定义类型中,我们还应该重写并提供一个实现 GetHashCode
支持生成唯一哈希代码以用于支持的方法 Hashtable
和 Dictionary
集合类,也可能是其他类。
这要求我们实现内部使用的哈希算法 overriden
GetHashCode
方法是最优且准确的,即它会生成该类型的唯一哈希值,并尽快执行此操作以提高使用我们类型的应用程序的性能。
我的问题是 哪些哈希算法 是准确的,并在使用时提供最佳性能 GetHashCode
执行?或者,我们应该只使用基本类型 GetHashCode
执行?我想知道这个答案 value types
和 reference types
..
编辑:下面是一个类的示例,说明了为什么我需要重写 Equals
:
public class Laptop : LaptopBase
{
public readonly string Make;
public readonly string ProcessorArch;
public readonly int MemorySupported;
public readonly int HardDiskGBSupported;
public readonly Color ColorName;
public Laptop(make, procArch, memorySupp, hdGB, color)
{
Make = make;
ProcessorArch = procArch;
MemorySupported = memorySupp;
HardDiskGBSupported = hdGB;
ColorName = color;
}
}
现在,我想为 2 个笔记本电脑实例返回 true,这些笔记本电脑实例的所有上述定义字段都相互匹配,因此需要覆盖 Equals
和 GetHashCode
方法以及您所看到的另一个要求是,这是一个派生类,可以进一步重用并支持多种方法;因此,不能将其设为值类型(结构)。我尝试使用上述类型的 2 个实例以及所有匹配的实例字段,如果我使用的基本实现 Equals
- 它返回 false
我想要它在哪里 true
..
我将如何支持这样的场景?
解决方案
这取决于它所实现的类型,但它应该提供良好的值分散性,并且 GetHashCode() 不一定要返回唯一值。它应该基于 Equals 实现中使用的那些字段,并且这些字段应该是不可变的。因此,结构和类对 Equals/GetHashCode 的要求是相同的。
正如 Henk 所说,最好不要重写 Equals/GetHashCode...