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) ?

Original source

Related problems