Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8323286

BitSet hashCode never changes when setting bit 127 % 128

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      IMPLEMENTOR="Ubuntu"
      JAVA_RUNTIME_VERSION="11.0.20.1+1-post-Ubuntu-0ubuntu120.04"
      JAVA_VERSION="11.0.20.1"
      JAVA_VERSION_DATE="2023-08-24"
      LIBC="gnu"
      MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.internal.le jdk.internal.opt jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jlink jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.ldap jdk.naming.rmi jdk.net jdk.pack jdk.rmic jdk.scripting.nashorn jdk.scripting.nashorn.shell jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
      OS_ARCH="x86_64"
      OS_NAME="Linux"


      A DESCRIPTION OF THE PROBLEM :
      The BitSet hashCode() method does not change when the 127 bit (modulo 128) is set. This is not a hash collision, it does not matter what bits are already set in the BitSet.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Create a BitSet, set any bits or even leave it empty. Call the hashCode() method to get the current hash code. Set bit 127 (or any bit equal to 127 modulo 128)., Again call the hashCode() method.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The call to the hashCode() method should not have the same results on the second call.
      ACTUAL -
      The call to the hashCode() method always has the same results on the second call.


      ---------- BEGIN SOURCE ----------
      import java.util.BitSet;

      public class BitSetTest {

          public static void main( String[] args ) {

              // Set the first 127 bits (0-126).
              BitSet bs = new BitSet();
              for( int i = 0; i <= 126; i++ ){
                  bs.set( i );
              }

              // Set bit 127 and verify the hash code does not change.
              int bsHC = bs.hashCode();
              bs.set( 127 );
              if( bsHC == bs.hashCode() ) {
                  System.out.println("Hashcode unchanged");
              }

              // Start with a new BitSet and only set bit 1
              bs = new BitSet();
              bs.set(1);
              bsHC = bs.hashCode();

              // Verify the hahscode does not change when setting bit 127
              bs.set(127);
              if( bsHC == bs.hashCode() ) {
                  System.out.println("Hashcode unchanged");
              }

              // Start with an empty BitSet and verify bit 127 is ignored.
              bs = new BitSet();
              bsHC = bs.hashCode();
              bs.set(127);
              if( bsHC == bs.hashCode() ) {
                  System.out.println("Hashcode unchanged");
              }

              // Verify any 127th bit modulo 128 is ignored.
              bs.set(255);
              if( bsHC == bs.hashCode() ) {
                  System.out.println("Hashcode unchanged");
              }

          }

      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Use Arrays.hashCode( bs.toLongArray() )

      FREQUENCY : always


            rgiulietti Raffaello Giulietti
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: