Search code examples
c#equalsgethashcode

GetHashCode Equals implementation for a class in C#


I have a class Person for which I have to override the Equals and GetHashCode method. Two person objects are equals if the Name matches OR if the Email matches. What's a good way of doing this with a considerably efficient hash function?

class Person
{
    string Name
    string Email

    public override Equals(object obj)
    {
        if (ReferenceEquals(obj, null))
            return false;
        if (ReferenceEquals(this, obj))
            return true;
        if (obj is Person)
        {
            Person person = (Person)obj;
            return
                (this.Name == person.Name)
                || (this.Email == person.Email);
        }
        return false;
    }

    public override GetHashCode()
    {
        // What's a good way to implement?
    }
}

Solution

  • You can't, really. Well, not apart from returning a constant value.

    Look at it this way... all people with email "x" have to have the same hash code, because they're equal. And all people with name "y" have to have the same hash code, and so it goes on:

    Name    Email    Hash
      n1       e1      h1
      n2       e1      h1 (because emails are equal
      n2       e2      h1 (because names are equal to previous)
    

    Note how we've managed to change both the name and the email to arbitrary values, but the hash has to still be h1.