关于.net:C#GetHashCode()高性能哈希算法

C# GetHashCode() High Performance Hashing Algorithm

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the best algorithm for an overridden System.Object.GetHashCode?

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

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

我的问题是,在GetHashCode实现中使用哪些哈希算法是准确的,并能提供最佳性能?或者,我们应该只使用基类型的GetHashCode实现吗?我想知道关于value typesreference types的答案。

编辑:下面是一个关于我为什么需要重写Equals的类的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,这些实例具有所有上述定义的字段相互匹配,因此需要重写EqualsGetHashCode方法,并且您可以看到的另一个要求是,这是一个派生类,可以进一步重用并支持许多方法;因此,不能将值类型(结构)。我尝试了两个以上类型的实例,所有匹配的实例字段,如果我使用EDOCX1的基本实现(0),它将返回false,我希望它是true。我该如何支持这种情况?


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

正如亨克所说,最好不要重写equals/gethashcode…