Equals & GetHashCode: Why is it important to override both?

It is important if your item will be used as a key in a dictionary, or HashSet, etc – since this is used to group items into buckets (in the absence of a custom IEqualityComparer). If the hash-code for two items does not match, they may never be considered equal and Equals() will never be called.

The GetHashCode() method should reflect the Equals logic; the rules are:

  • if two things are equal (Equals(…) == true) then they must return the same value for GetHashCode()
  • if the GetHashCode() is equal, it is not necessary for them to be the same; this is a collision, and Equals will be called to see if it is a real equality or not.

In this case, it looks like “return FooId;” is a suitable GetHashCode() implementation. If you are testing multiple properties, it is common to combine them using code like below, to reduce diagonal collisions (i.e. so that new Foo(3,5) has a different hash-code to new Foo(5,3)):

int hash = 13;
hash = (hash * 7) + field1.GetHashCode();
hash = (hash * 7) + field2.GetHashCode();
...
return hash;

Oh – for convenience, you might also consider providing == and != operators when overriding Equals() and GetHashCode().

Source: http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overridden

Tags:

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Related Post

%d bloggers like this: