C#GetHashCode()高性能哈希算法

C#GetHashCode()高性能哈希算法,c#,.net,object,gethashcode,hashalgorithm,C#,.net,Object,Gethashcode,Hashalgorithm,可能重复: 我们知道,如果在自定义类型中重写对象的Equals方法,我们还应该重写并提供GetHashCode方法的实现,以支持生成唯一的哈希代码,用于支持Hashtable和Dictionary集合类,也可以是其他类 这就要求我们在覆盖的GetHashCode方法中使用的散列算法的实现是最佳的和准确的,即它生成该类型的唯一散列,并尽快这样做,以提高使用我们类型的应用程序的性能 我的问题是当在GetHashCode实现中使用时,哪些散列算法是准确的并提供最佳性能?或者,我们应该只使用基类型的G

可能重复:

我们知道,如果在自定义类型中重写
对象
Equals
方法,我们还应该重写并提供
GetHashCode
方法的实现,以支持生成唯一的哈希代码,用于支持
Hashtable
Dictionary
集合类,也可以是其他类

这就要求我们在
覆盖的
GetHashCode
方法中使用的散列算法的实现是最佳的和准确的,即它生成该类型的唯一散列,并尽快这样做,以提高使用我们类型的应用程序的性能

我的问题是当在
GetHashCode
实现中使用时,哪些散列算法是准确的并提供最佳性能?或者,我们应该只使用基类型的
GetHashCode
实现吗?我想知道
值类型
参考类型
的答案

编辑:下面是一个类的示例,说明了我为什么需要覆盖
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;
    }
}
现在,我想为两个膝上型计算机实例返回true,它们的所有上述定义字段都相互匹配,因此需要重写
Equals
GetHashCode
方法,并且您可以看到另一个要求是,这是一个派生类,可以进一步重用并支持许多方法;因此,不能使其成为值类型(struct)。我尝试了上述类型的两个实例,其中包含所有匹配的实例字段,如果我使用
Equals
的基本实现,它将返回
false
,返回我希望的
true
。。
我如何支持这样的场景?

这取决于它的实现类型,但它应该提供良好的值分散性,并且GetHashCode()不必返回唯一的值。它应该基于Equals实现中使用的字段,并且这些字段应该是不可变的。因此Equals/GetHashCode对结构和类的要求是相同的


正如亨克所说,最好不要覆盖Equals/GetHashCode…

哈希不需要唯一,只是如果a.Equals(b)那么a.GetHashCode()==b.GetHashCode()这已经被问了很多次了,搜索。最好的建议可能是:不要覆盖Equals等人。你不太可能得到“最佳”哈希函数的一般答案。这在很大程度上取决于你对平等的定义,以及你的目标总体上是什么样子的。我建议您查看一下站点,看看其他人是如何实现的
GetHashCode
,然后针对特定的用例问一个特定的问题。@BrokenGlass我已经编辑并提供了一个用例。.我还建议您在结束问题之前等待相当长的时间,并留出时间编辑该用例问题。。。Thanks@HenkHolterman我添加了一个代码场景,希望重新打开这个问题并重新检查答案和想法。。