可能的重复:
重写 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,这些笔记本电脑实例的所有上述定义字段都相互匹配,因此需要覆盖 EqualsGetHashCode 方法以及您所看到的另一个要求是,这是一个派生类,可以进一步重用并支持多种方法;因此,不能将其设为值类型(结构)。我尝试使用上述类型的 2 个实例以及所有匹配的实例字段,如果我使用的基本实现 Equals - 它返回 false 我想要它在哪里 true.. 我将如何支持这样的场景?

有帮助吗?

解决方案

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

正如 Henk 所说,最好不要重写 Equals/GetHashCode...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top