C#GetHashCode()高性能散列算法
可能重复:
什么是重写的System.Object.GetHashCode的最佳算法?
我们知道,如果我们在自定义类型中重写Object
的Equals
方法,我们还应该覆盖并提供GetHashCode
方法的实现,以支持生成唯一的哈希代码以用于支持Hashtable
和Dictionary
集合类,也可能是其他类。
这要求我们在被overriden
内部使用的哈希算法的实现GetHashCode
方法是最优和准确的,即它生成一个唯一的类型哈希,并尽可能快地提高性能,以提高使用我们类型的应用程序的性能。
我的问题是哈希算法在GetHashCode
实现中使用时是否准确并且性能最优? 或者,我们是否应该只使用基类型的GetHashCode
实现? 我想知道这个value types
和reference 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个Laptop实例返回true,这两个实例的所有上面定义的字段都相互匹配,因此需要重写Equals
和GetHashCode
方法,另外一个需求是,您可以看到这是一个派生类,可能是进一步重用并支持一些方法; 因此,不能成为值类型(结构)。 我尝试过使用所有匹配实例字段的上述类型的2个实例,如果我使用Equals
的基本实现 - 它将返回false
,我希望它是true
。 如何支持这种情况?
它取决于它实现的类型,但它应该给出值的良好分散,并且它不是GetHashCode()返回唯一值的必须条件。 它应该基于Equals实现中使用的那些字段,并且这些字段应该是不可变的。 因此对于结构和类,Equals / GetHashCode的要求是相同的。
正如Henk所说,最好不要覆盖Equals / GetHashCode ......
链接地址: http://www.djcxy.com/p/39761.html