United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
JDK-4245470 : algorithm of java.lang.Byte.hashCode() is not specified

Details
Type:
Bug
Submit Date:
1999-06-10
Status:
Resolved
Updated Date:
2009-10-09
Project Name:
JDK
Resolved Date:
2009-10-09
Component:
core-libs
OS:
solaris_2.5
Sub-Component:
java.lang
CPU:
sparc
Priority:
P4
Resolution:
Fixed
Affected Versions:
1.2.0,1.3.0
Fixed Versions:

Related Reports

Sub Tasks

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
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
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



Hardware and Software, Engineered to Work Together