HBASE-12413 Mismatch in the equals and hashcode methods of KeyValue (Jingcheng Du and Gariel Reid)
This commit is contained in:
parent
5038fc76c9
commit
bd837d47f7
|
@ -244,7 +244,6 @@ public class CellComparator implements Comparator<Cell>, Serializable {
|
|||
|
||||
/**
|
||||
* Returns a hash code that is always the same for two Cells having a matching equals(..) result.
|
||||
* Currently does not guard against nulls, but it could if necessary.
|
||||
*/
|
||||
public static int hashCode(Cell cell){
|
||||
if (cell == null) {// return 0 for empty Cell
|
||||
|
@ -258,8 +257,7 @@ public class CellComparator implements Comparator<Cell>, Serializable {
|
|||
|
||||
/**
|
||||
* Returns a hash code that is always the same for two Cells having a matching
|
||||
* equals(..) result. Currently does not guard against nulls, but it could if
|
||||
* necessary. Note : Ignore mvcc while calculating the hashcode
|
||||
* equals(..) result. Note : Ignore mvcc while calculating the hashcode
|
||||
*
|
||||
* @param cell
|
||||
* @return hashCode
|
||||
|
|
|
@ -1064,15 +1064,12 @@ public class KeyValue implements Cell, HeapSize, Cloneable, SettableSequenceId,
|
|||
return CellComparator.equals(this, (Cell)other);
|
||||
}
|
||||
|
||||
/**
|
||||
* In line with {@link #equals(Object)}, only uses the key portion, not the value.
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
byte[] b = getBuffer();
|
||||
int start = getOffset(), end = getOffset() + getLength();
|
||||
int h = b[start++];
|
||||
for (int i = start; i < end; i++) {
|
||||
h = (h * 13) ^ b[i];
|
||||
}
|
||||
return h;
|
||||
return CellComparator.hashCodeIgnoreMvcc(this);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
@ -35,6 +35,8 @@ import org.apache.hadoop.hbase.KeyValue.MetaComparator;
|
|||
import org.apache.hadoop.hbase.KeyValue.Type;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
public class TestKeyValue extends TestCase {
|
||||
private final Log LOG = LogFactory.getLog(this.getClass().getName());
|
||||
|
||||
|
@ -614,4 +616,22 @@ public class TestKeyValue extends TestCase {
|
|||
b = new KeyValue(Bytes.toBytes("table,111,222,bbb"), now);
|
||||
assertTrue(c.compare(a, b) < 0);
|
||||
}
|
||||
|
||||
public void testEqualsAndHashCode() throws Exception {
|
||||
KeyValue kvA1 = new KeyValue(Bytes.toBytes("key"), Bytes.toBytes("cf"),
|
||||
Bytes.toBytes("qualA"), Bytes.toBytes("1"));
|
||||
KeyValue kvA2 = new KeyValue(Bytes.toBytes("key"), Bytes.toBytes("cf"),
|
||||
Bytes.toBytes("qualA"), Bytes.toBytes("2"));
|
||||
// We set a different sequence id on kvA2 to demonstrate that the equals and hashCode also
|
||||
// don't take this into account.
|
||||
kvA2.setSequenceId(2);
|
||||
KeyValue kvB = new KeyValue(Bytes.toBytes("key"), Bytes.toBytes("cf"),
|
||||
Bytes.toBytes("qualB"), Bytes.toBytes("1"));
|
||||
|
||||
assertEquals(kvA1, kvA2);
|
||||
assertNotEquals(kvA1, kvB);
|
||||
assertEquals(kvA1.hashCode(), kvA2.hashCode());
|
||||
assertNotEquals(kvA1.hashCode(), kvB.hashCode());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue