Table of contents
Things that I would like to be covered, but haven’t been yet:
- How to create the integer (How to “convert” an object into an int wasn’t very obvious to me anyways).
- What fields to base the hash code upon.
- If it should only be on immutable fields, what if there are only mutable ones?
- How to generate a good random distribution. (MSDN Property #3)
- Part to this, seems to choose a good magic prime number (have seen 17, 23 and 397 been used), but how do you choose it, and what is it for exactly?
- How to make sure the hash code stays the same all through the object lifetime. (MSDN Property #2)
- Especially when the equality is based upon mutable fields. (MSDN Property #1)
- How to deal with fields that are complex types (not among the built-in C# types).
- Complex objects and structs, arrays, collections, lists, dictionaries, generic types, etc.
- For example, even though the list or dictionary might be readonly, that doesn’t mean the contents of it are.
- How to deal with inherited classes.
- Should you somehow incorporate
base.GetHashCode()
into your hash code?
- Should you somehow incorporate
- Could you technically just be lazy and return 0? Would heavily break MSDN guideline number #3, but would at least make sure #1 and #2 were always true 😛
- Common pitfalls and gotchas.