C#GetHashCode() 高性能散列算法 [重复]
Posted
技术标签:
【中文标题】C#GetHashCode() 高性能散列算法 [重复]【英文标题】:C# GetHashCode() High Performance Hashing Algorithm [duplicate] 【发布时间】: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 我添加了一个代码场景,并希望重新打开这个问题并重新检查答案和想法..
【参考方案1】:
这取决于实现它的类型,但它应该能很好地分散值,GetHashCode() 不必返回唯一值。它应该基于 Equals 实现中使用的那些字段,并且这些字段应该是不可变的。所以对于 Equals/GetHashCode 的要求对于结构和类来说是一样的。
正如 Henk 所说,最好不要覆盖 Equals/GetHashCode...
【讨论】:
以上是关于C#GetHashCode() 高性能散列算法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
什么是适用于 2D 点结构的“GetHashCode()”算法(避免冲突)
使用 hash_map 时在 stl 字符串上使用的最佳散列算法是啥?