3

可能重复:
覆盖 System.Object.GetHashCode 的最佳算法是什么?

我们知道,如果我们重写自定义类型中的Equals方法Object,我们还应该重写并提供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,这些实例的所有上述定义的字段都相互匹配,因此需要重写EqualsandGetHashCode方法,并且您可以看到的另一个要求是,这是一个派生类,并且可以重新进一步使用并支持多种方法;因此,不能成为值类型(结构)。我尝试使用具有所有匹配实例字段的上述类型的 2 个实例,如果我使用Equals- 它的基本实现,它会返回false我想要的位置true我将如何支持这种情况?

4

1 回答 1

1

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

正如 Henk 所说,最好不要覆盖 Equals/GetHashCode ......

于 2012-05-19T18:59:23.870 回答