JDK-4245470 : algorithm of java.lang.Byte.hashCode() is not specified
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang
  • Affected Version: 1.2.0,1.3.0
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: solaris_2.5
  • CPU: sparc
  • Submitted: 1999-06-10
  • Updated: 2017-05-16
  • Resolved: 2009-10-09
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b74Fixed
Description
Name: mgC56079			Date: 06/10/99


Documentation does not specify how hash code of Byte object is
calculated. This is also true for Short class as well.

The hashcode is specified for other numeric classes.

======================================================================

Comments
SUGGESTED FIX # HG changeset patch # User martin # Date 1253669458 25200 # Node ID bbb543254c6362b3cdba2b5d049fe931a58408af # Parent c715b68cdcaf69f9456bff3bec234e31a92f77b8 4245470: algorithm of java.lang.Byte.hashCode() is not specified Summary: Specify some hashCode methods are equivalent to intValue Reviewed-by: darcy --- a/src/share/classes/java/lang/Byte.java Tue Sep 22 16:11:23 2009 -0700 +++ b/src/share/classes/java/lang/Byte.java Tue Sep 22 18:30:58 2009 -0700 @@ -378,7 +378,10 @@ public final class Byte extends Number i } /** - * Returns a hash code for this {@code Byte}. + * Returns a hash code for this {@code Byte}; equal to the result + * of invoking {@code intValue()}. + * + * @return a hash code value for this {@code Byte} */ public int hashCode() { return (int)value; --- a/src/share/classes/java/lang/Character.java Tue Sep 22 16:11:23 2009 -0700 +++ b/src/share/classes/java/lang/Character.java Tue Sep 22 18:30:58 2009 -0700 @@ -2612,8 +2612,10 @@ class Character extends Object implement } /** - * Returns a hash code for this <code>Character</code>. - * @return a hash code value for this object. + * Returns a hash code for this {@code Character}; equal to the result + * of invoking {@code charValue()}. + * + * @return a hash code value for this {@code Character} */ public int hashCode() { return (int)value; --- a/src/share/classes/java/lang/Short.java Tue Sep 22 16:11:23 2009 -0700 +++ b/src/share/classes/java/lang/Short.java Tue Sep 22 18:30:58 2009 -0700 @@ -383,7 +383,10 @@ public final class Short extends Number } /** - * Returns a hash code for this {@code Short}. + * Returns a hash code for this {@code Short}; equal to the result + * of invoking {@code intValue()}. + * + * @return a hash code value for this {@code Short} */ public int hashCode() { return (int)value; --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/lang/HashCode.java Tue Sep 22 18:30:58 2009 -0700 @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Google, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4245470 + * @summary Test the primitive wrappers hashCode() + */ + +import java.util.Random; + +public class HashCode { + + final Random rnd = new Random(); + + void test(String args[]) throws Exception { + int[] ints = { + Integer.MIN_VALUE, + Short.MIN_VALUE, + Character.MIN_VALUE, + Byte.MIN_VALUE, + -1, 0, 1, + Byte.MAX_VALUE, + Character.MAX_VALUE, + Short.MAX_VALUE, + Integer.MAX_VALUE, + rnd.nextInt(), + }; + + for (int x : ints) { + check( new Long(x).hashCode() == (int)((long)x ^ (long)x>>>32)); + check(Long.valueOf(x).hashCode() == (int)((long)x ^ (long)x>>>32)); + check( new Integer(x).hashCode() == x); + check(Integer.valueOf(x).hashCode() == x); + check( new Short((short)x).hashCode() == (short) x); + check(Short.valueOf((short)x).hashCode() == (short) x); + check( new Character((char) x).hashCode() == (char) x); + check(Character.valueOf((char) x).hashCode() == (char) x); + check( new Byte((byte) x).hashCode() == (byte) x); + check(Byte.valueOf((byte) x).hashCode() == (byte) x); + } + } + + //--------------------- Infrastructure --------------------------- + volatile int passed = 0, failed = 0; + void pass() {passed++;} + void fail() {failed++; Thread.dumpStack();} + void fail(String msg) {System.err.println(msg); fail();} + void unexpected(Throwable t) {failed++; t.printStackTrace();} + void check(boolean cond) {if (cond) pass(); else fail();} + void equal(Object x, Object y) { + if (x == null ? y == null : x.equals(y)) pass(); + else fail(x + " not equal to " + y);} + public static void main(String[] args) throws Throwable { + new HashCode().instanceMain(args);} + public void instanceMain(String[] args) throws Throwable { + try {test(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +}
2009-09-28

PUBLIC COMMENTS See http://hg.openjdk.java.net/jdk7/tl/jdk/rev/bbb543254c63
2009-09-28

EVALUATION Omitting exactly how the hash code is calculated is in general arguably a feature rather than a bug since it allows the hashing algorithm to be improved over time. However, since about half of the wrapper classes state exactly how the hash code is computed, for consistency, the other half probably should too.
2005-11-09