C# GetHashCode() High Performance Hashing Algorithm
Possible Duplicate:
What is the best algorithm for an overridden System.Object.GetHashCode?
我们知道,如果我们在自定义类型中重写Object的Equals方法,我们还应该重写并提供GetHashCode方法的实现,以支持生成唯一的哈希代码,用于支持Hashtable和Dictionary集合类,并且可以是其他类。
这就要求我们实现在overridenGetHashCode方法中使用的散列算法是最佳和准确的,即它生成一个类型的唯一散列,并尽可能快地这样做,以提高使用我们类型的应用程序的性能。
我的问题是,在GetHashCode实现中使用哪些哈希算法是准确的,并能提供最佳性能?或者,我们应该只使用基类型的GetHashCode实现吗?我想知道关于value types和reference 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,这些实例具有所有上述定义的字段相互匹配,因此需要重写Equals和GetHashCode方法,并且您可以看到的另一个要求是,这是一个派生类,可以进一步重用并支持许多方法;因此,不能将值类型(结构)。我尝试了两个以上类型的实例,所有匹配的实例字段,如果我使用EDOCX1的基本实现(0),它将返回false,我希望它是true。我该如何支持这种情况?
- Hashes arent required to be one just that if a.equals(b)then a.gethashchode()==b.gethashchode()
- 这已经问了很多次了,寻找。而且,最好的建议很可能是:不要超越平等等级等。
- 你不喜欢接收一个通用的答案来回答"最佳"功能应该是什么。这在很大程度上取决于你对平等的定义以及你的对象在一般情况下是什么样子的。我建议你看看这个网站周围,看看其他人是如何执行GetHashCode的,然后问一个具体的问题。
- @brokenglass I have edited and provided a use case..I would also suggest to wait for a considerable time before the questions closing and give time to edit the questions…
- @Henkholterman I have added a code scenario and would like this question to be reopened and reexamined for answers and thoughts..
- 你在公共场合下,在没有平等的前提下,设置了一个可变异的类别。不太好如果这是真正的阶级,不要过分。
- @Henkholterman Thats just a sample class to demo the scenario,in real case it would be an immutable class with read-only fields and constructor initiatization..
- 【Pickles I suppose the EDOCX1〕〔0〕Implementation of Objectalways produces a unique hashcode for the current appdomain
- 不,不应该是独一无二的复制这个网站码到您的网站上以设置一个投票箱在您的网站上。如你所说(加上检查[Laptom&U Model&U Name])
- @Csharpvj,hash codes are not guaranteed unique at all.
它取决于实现它所依赖的类型,但它应该提供良好的值分散性,getHashCode()不必返回唯一的值。它应该基于那些在Equals实现中使用的字段,并且这些字段应该是不可变的。因此,对于结构和类,equals/gethashcode的要求是相同的。
正如亨克所说,最好不要重写equals/gethashcode…