HashCodeBuilder.append(long) is incorrect -----------------------------------------
Key: LANG-342 URL: https://issues.apache.org/jira/browse/LANG-342 Project: Commons Lang Issue Type: Bug Reporter: Benjamin Manes Priority: Minor I was looking at using HashCodeBuilder rather than always writing out the strategy by hand, and I noticed one potential mistake: /** * Append a hashCode for a long. * * @param value the long to add to the hashCode * @return this */ public HashCodeBuilder append(long value) { iTotal = iTotal * iConstant + ((int) (value ^ (value >> 32))); return this; } whereas Effective Java and Long.hashCode() use: /** * Returns a hash code for this <code>Long</code>. The result is * the exclusive OR of the two halves of the primitive * <code>long</code> value held by this <code>Long</code> * object. That is, the hashcode is the value of the expression: * <blockquote><pre> * (int)(this.longValue()^(this.longValue()>>>32)) * </pre></blockquote> * * @return a hash code value for this object. */ public int hashCode() { return (int)(value ^ (value >>> 32)); } So the author accidentally used a signed right-shift rather than an unsigned. ---- Stephen Colebourne noted that while this is a bug, it is minor and could have backward compatability issues. I would simply recommend that a non-JavaDoc comment be added noting this method doesn't follow "Effective Java" correctly. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]