Fixed sonar issues in o.o.y.util package.
[yangtools.git] / common / util / src / main / java / org / opendaylight / yangtools / util / HashCodeBuilder.java
index 1b6b881556e0c8fab32154028436ade18ec64410..fc8da01f1ae01b9da077533f1b9abf9fbfeb2ec6 100644 (file)
@@ -16,6 +16,18 @@ import org.opendaylight.yangtools.concepts.Builder;
  * @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;
 
     /**
@@ -44,7 +56,7 @@ public final class HashCodeBuilder<T> implements Builder<Integer> {
      * @return Combined hash code
      */
     public static int nextHashCode(final int hashCode, final Object obj) {
-        return 31 * hashCode + obj.hashCode();
+        return PRIME * hashCode + obj.hashCode();
     }
 
     /**