OpenBitSet#hashCode() may return false for identical sets.
----------------------------------------------------------

                 Key: LUCENE-2216
                 URL: https://issues.apache.org/jira/browse/LUCENE-2216
             Project: Lucene - Java
          Issue Type: Bug
          Components: Other
    Affects Versions: 3.0, 2.9.1, 2.9
            Reporter: Dawid Weiss
            Priority: Minor


OpenBitSet uses an internal buffer of long variables to store set bits and an 
additional 'wlen' index that points 
to the highest used component inside {...@link #bits} buffer.

Unlike in JDK, the wlen field is not continuously maintained (on clearing bits, 
for example). This leads to a situation when wlen may point
far beyond the last set bit. 

The hashCode implementation iterates over all long components of the bits 
buffer, rotating the hash even for empty components. This is against the 
contract of hashCode-equals. The following test case illustrates this:

{code}
// initialize two bitsets with different capacity (bits length).
BitSet bs1 = new BitSet(200);
BitSet bs2 = new BitSet(64);
// set the same bit.
bs1.set(3);
bs2.set(3);
        
// equals returns true (passes).
assertEquals(bs1, bs2);
// hashCode returns false (against contract).
assertEquals(bs1.hashCode(), bs2.hashCode());
{code}

Fix and test case attached.

-- 
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: java-dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-dev-h...@lucene.apache.org

Reply via email to