Best implementation for hashCode method for a collection
equals, hash, hashcode, java
Solution
The best implementation? That is a hard question because it depends on the usage pattern.
A for nearly all cases reasonable good implementation was proposed in Josh Bloch's Effective Java in Item 8 (second edition). The best thing is to look it up there because the author explains there why the approach is good.
A short version
Create a `int result` and assign a non-zero value.
For every field `f` tested in the `equals()` method, calculate a hash code `c` by:
- If the field f is a `boolean`: calculate `(f ? 0 : 1)`;
- If the field f is a `byte`, `char`, `short` or `int`: calculate `(int)f`;
- If the field f is a `long`: calculate `(int)(f ^ (f >>> 32))`;
- If the field f is a `float`: calculate `Float.floatToIntBits(f)`;
- If the field f is a `double`: calculate `Double.doubleToLongBits(f)` and handle the return value like every long value;
- If the field f is an object: Use the result of the `hashCode()` method or 0 if `f == null`;
- If the field f is an array: see every field as separate element and calculate the hash value in a recursive fashion and combine the values as described next.
Combine the hash value `c` with `result`:
result = 37 * result + c
Return `result`
This should result in a proper distribution of hash values for most use situations.
Problem
How do we decide on the best implementation of `hashCode()` method for a collection (assuming that equals method has been overridden correctly) ?