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?

我们知道,如果我们在自定义类型中重写 ObjectEquals 方法,我们还应该重写并提供 GetHashCode 方法的实现,以支持生成唯一的哈希码以支持HashtableDictionary 集合类,可能是其他类。

这要求我们实现 overriden GetHashCode 方法中使用的散列算法是最佳且准确的,即它生成该类型的唯一散列,并尽可能快地执行此操作以提高使用我们的应用程序的性能输入。

我的问题是哪些散列算法GetHashCode 实现中使用时是准确的并能提供最佳性能?或者,我们应该只使用基类型的GetHashCode 实现吗?我想知道value typesreference 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,因此需要覆盖 EqualsGetHashCode 方法,并且您可以看到另一个要求是是一个派生类,可以进一步重用并支持多种方法;因此,不能成为值类型(结构)。我尝试使用具有所有匹配实例字段的上述类型的 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()”算法(避免冲突)

未调用 C#GetHashCode/Equals 覆盖

C#字符串的GetHashCode()是如何实现的?

使用 hash_map 时在 stl 字符串上使用的最佳散列算法是啥?

使用 hash_map 时在 stl 字符串上使用的最佳散列算法是啥?

Object Equals && GetHashCode