在这里看到的默认实现: http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
GetHashCode方法的默认实现不保证唯一的返回值不同的对象。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间将保持不变。因此,此方法的默认实现不能用作用于散列目的的唯一对象标识符。
但我觉得你真的想知道的是哈希码是如何工作的。
比方说,你有下面的类:
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
}
现在,让我们说你要比较两个人,检查他们是否有相同的名字,你是怎么做到这一点?您重写在Object中实现的等于。 (在C#中的所有类继承对象隐含的) 像这样:
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
public override bool Equals(Object obj)
{
if(obj == null)
return false // not equal if obj is null
Equals temp = obj as Equals; // temp set to null if obj can not be cast to equals
if(p == null)
return false
// if code gets here, the code object passed is an instance of Equals.
// Now we have to check if the strings match.
bool isEqual = p.name == this.name; // set if the two names match
return isEqual; // return if these two match
}
}
所以,现在,你可以检查,如果两个人都是平等的。 例子:
Person p1 = new Person("Jack");
Person p2 = new Person("Jack");
Person p3 = new Person("Jill");
Object p4 = new Person("Jill");
p1.Equals(p2) // returns true
p1.Equals(p3) // returns false
p4.Equals(p1) // returns false
p4.Equals(p3) // returns true
现在,让我们说你有一个巨大的人一样,一百万的列表,你想知道,如果命名"amy"
的人在这个列表中存在。你如何找到这个人?你会一个一个地循环所有的名字,并检查这个人是否等于艾米?但是这样会很慢,如果艾米是这个名单中的第100万人呢?我们如何提高性能?
输入哈希码。
让我们假设你写一个简单的哈希码算法: 哈希码是人名中每个字母的每个数字的总和。
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
public override bool Equals(Object obj)
{
if(obj == null)
return false // not equal if obj is null
Equals temp = obj as Equals; // temp set to null if obj can not be cast to equals
if(p == null)
return false
// if code gets here, the code object passed is an instance of Equals.
// Now we have to check if the strings match.
bool isEqual = p.name == this.name; // set if the two names match
return isEqual; // return if these two match
}
public override int GetHashCode()
{
int sum = 0;
foreach(char c in this.name)
{
sum += c;
}
return sum;
}
}
因此,如果我们有amy
她的哈希码会1 + 13 + 25
,所以38
。
现在不是一个普通的列表,而是有一个名为“桶”的列表。你的散列码决定你去哪个桶。 amy
has hascode如果38
她去桶38
。
现在让我们说我们有另外一个人,名字may
,她有她的名字相同的字母,所以她的哈希码也38
,她也进入水桶现在38
,只要你想,以检查是否艾米存在在这个列表中。我们首先检查她的哈希码,其中38
,现在我们去查看桶38,并且循环遍历桶38
中的所有对象,我们检查桶38
中的任何对象是否匹配amy,如果为true,则返回true,如果为false,则返回false 。所以如果你有一百万人,那么你必须做的检查清单才能知道amy
是否存在于这个清单中,这个清单会大大减少。
所以基本上,如果你要使用的哈希码你得遵守以下规则:
- 您必须覆盖&实现equals如果你要使用的哈希码。
- 的两个对象,其中的Equals返回true,就必须有相同的hashCode
- 两个对象是不同的可能具有相同的哈希码,但不一定必须是相同的。
这基本上就是它的要义。
你运行过吗?结果是什么?测试你自己的时间比在这里问的要少得多。 – Oded
您不希望它们具有相同的哈希码。 –
@已付给你的权利,但我试图在sa字符串上,我得到了相同的结果,然后在这个类上尝试它,并得到了相同的rsult,令人困惑 – Star