【发布时间】:2012-05-26 22:21:32
【问题描述】:
可能重复:
What is the best algorithm for an overridden System.Object.GetHashCode?
我们知道,如果我们在自定义类型中重写 Object 的 Equals 方法,我们还应该重写并提供 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..
我将如何支持这种情况?
【问题讨论】:
-
哈希不需要是唯一的,如果 a.Equals(b) 那么 a.GetHashCode() == b.GetHashCode()
-
这个已经问过很多次了,搜索一下。最好的建议可能是:不要覆盖 Equals 等。
-
您不太可能收到关于“最佳”哈希函数是什么样子的通用答案。这在很大程度上取决于您对相等性的定义以及您的对象的一般外观。我建议您环顾该网站,了解其他人如何实现
GetHashCode,然后针对特定用例提出具体问题。 -
@BrokenGlass 我已经编辑并提供了一个用例..我还建议在关闭问题之前等待相当长的时间,并留出时间编辑问题...谢谢
-
@HenkHolterman 我添加了一个代码场景,并希望重新打开这个问题并重新检查答案和想法..
标签: c# .net object gethashcode hashalgorithm