75

I'd like to hear from the community on how I should go about implementing GetHashCode (or override it) for my object. I understand I need to do so if I override the equals method. I have implemented it a fair amount of times, sometimes just calling the base method. I understand that my object should equal another instance of the object if it contains the same details (members). What is the best way to get a hash code from the class's members?

7

1 Answer 1

67

Let's say your class looks like this:

class Frob {
    public string Foo { get; set; }
    public int Bar { get; set; }
    public double FooBar { get; set; }
}

Let's say you define equals so that two instances of Frob are equal if their Foo and their Bar are equal, but FooBar doesn't matter.

Then you should define GetHashCode in terms of Foo and Bar. One way is like this:

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();

Basically, you just want to incorporate all the fields that go into defining the equality. One way is to just keep accumulating and multiplying by 17 like I've done. It's fast, it's simple, it's correct, and it usually gives a good distribution.

Sign up to request clarification or add additional context in comments.

18 Comments

I have a feeling this should be a question itself, but why 23?
maybe point out that GetHashCode only tells you if two objects might be considered equal. There's still the posibility of a hash collision.
Be careful with implementing GetHashCode() (and Equals()) as depending on mutable data, like here. If you put such object into a hash-based dictionary, and then mutate it, the dictionary won't work correctly anymore. Ideally, GetHashCode() (and Equals()) should depend only on immutable data.
I think the calculation should be wrapped with the unchecked keyword, like so: unchecked(this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode()). The sum might be larger than int.MaxValue.
@Quintus: I stand corrected. When assigning Bar = int.MaxValue; Foo = "something", running the GetHashCode() function and not having the unchecked keyword, the code will run and produce a negative hashcode and not crash, so the unchecked keyword is not necessary
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.