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 resultand assign a non-zero value. -
For every field
ftested in theequals()method, calculate a hash codecby:- If the field f is a
boolean:
calculate(f ? 0 : 1); - If the field f is a
byte,char,shortorint: calculate(int)f; - If the field f is a
long: calculate(int)(f ^ (f >>> 32)); - If the field f is a
float: calculateFloat.floatToIntBits(f); - If the field f is a
double: calculateDouble.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 iff == 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.
- If the field f is a
-
Combine the hash value
cwithresult:result = 37 * result + c -
Return
result
This should result in a proper distribution of hash values for most use situations.