GetHashCode功能

时间:2012-06-16 05:05:07

标签: c# .net

为什么两个对象的哈希码不相同,即使它们具有相似的值。找到对象之间的值相等而不读取每个属性并检查其他属性的另一种最佳方法是什么?

                Person person = new Person();
                person.Name = "X";
                person.Age = 25;
                person.Zip = 600056;
                person.Sex = 'M';

                Person person1 = new Person();
                person1.Name = "X";
                person1.Age = 25;
                person1.Zip = 600056;
                person1.Sex = 'M';


                int hashCode1 = person1.Name.GetHashCode();
                int hashCode = person.Name.GetHashCode();

                // hashCode1 and hashCode values are same.

                if (person.GetHashCode() == person1.GetHashCode())
                {
                    // Condition is not satisfied
                }

3 个答案:

答案 0 :(得分:3)

您的代码中的

hashCode1 == hashCode为true,因为哈希相同的字符串将始终为您提供相同的结果。但是,不同的情况是不同的,所以你必须以适合你的业务逻辑的方式覆盖GetHashCode(),例如

    public override int GetHashCode()
    {
        return Name.GetHashCode() ^ Zip.GetHashCode() ^ Sex ^ Age;
    }

我很高兴你看看这个答案GetHashCode Guidelines in C#

http://musingmarc.blogspot.com/2007/08/vtos-rtos-and-gethashcode-oh-my.html

答案 1 :(得分:2)

在您的示例中,两个对象都相似但不相同。它们是不同的实例,因此它们具有不同的哈希码。 person1 == person2和person1.Equals(person2)也是假的。

您可以覆盖此行为。如果您认为这两个对象相同,如果这些属性相同,您可以:

public override bool Equals(object other) {
    if(other == this) return true;

    var person = other as Person;
    if(person == null) return false;

    return person.Name == Name && person.Age == Age && person.Zip == Zip && person.Sex == Sex;

}

public override int GetHashCode() {
    //some logic to create the Hash Code based on the properties. i.e.
    return (Name + Age + Zip + Sex).GetHashCode(); // this is just a bad example!
}

答案 2 :(得分:1)

  

为什么两个对象的哈希码不相同,即使它们具有相似的值

因为这是唯一识别它们的预期方式。 AFAIK,大多数框架/库默认使用指针值。

  

在对象中找到值相等的另一种最佳方法是什么,不读取每个属性并检查其他属性?

根据您的需要,取决于使他们“平等”的原因。基本上它仍在比较属性,但可能只是更有限。