* @param <T> Component objec type
*/
public final class HashCodeBuilder<T> implements Builder<Integer> {
+ /**
+ *
+ * The value 31 was chosen because it is an odd prime. If it were even and the multiplication
+ * overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The
+ * advantage of using a prime is less clear, but it is traditional. A nice property of 31 is
+ * that the multiplication can be replaced by a shift and a subtraction for better performance:
+ * 31 * i == (i << 5) - i. Modern VMs do this sort of optimization automatically.
+ *
+ * (from Joshua Bloch's Effective Java, Chapter 3, Item 9: Always override hashcode when you
+ * override equals, page 48)
+ */
+ private static final int PRIME = 31;
private int currentHash;
/**
* @return Combined hash code
*/
public static int nextHashCode(final int hashCode, final Object obj) {
- return 31 * hashCode + obj.hashCode();
+ return PRIME * hashCode + obj.hashCode();
}
/**