Fix Java hashCode implementation (#7860)

Summary:
Classes ColumnFamilyHandle and CapturingWriteBatchHandler.Event have
byte array fields as part of their identity, but they do not use the
arrays' content to compute the instance's hash, and instead rely on the
arrays' identity, causing instances to have different hashcodes
although they are equal.
The PR addresses it by using the arrays' content to compute the hash,
like the equals method does.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7860

Reviewed By: jay-zhuang

Differential Revision: D25901327

Pulled By: akankshamahajan15

fbshipit-source-id: 347e7b3d2ba7befe7faa956b033e6421b9d0c235
This commit is contained in:
Laurent Goujon 2021-01-13 10:03:27 -08:00 committed by Facebook GitHub Bot
parent 8e7b068ecc
commit 0426d4a4ee
2 changed files with 7 additions and 3 deletions

View File

@ -115,7 +115,9 @@ public class ColumnFamilyHandle extends RocksObject {
@Override @Override
public int hashCode() { public int hashCode() {
try { try {
return Objects.hash(getName(), getID(), rocksDB_.nativeHandle_); int result = Objects.hash(getID(), rocksDB_.nativeHandle_);
result = 31 * result + Arrays.hashCode(getName());
return result;
} catch (RocksDBException e) { } catch (RocksDBException e) {
throw new RuntimeException("Cannot calculate hash code of column family handle", e); throw new RuntimeException("Cannot calculate hash code of column family handle", e);
} }

View File

@ -156,8 +156,10 @@ public class CapturingWriteBatchHandler extends WriteBatch.Handler {
@Override @Override
public int hashCode() { public int hashCode() {
int result = Objects.hash(action, columnFamilyId);
return Objects.hash(action, columnFamilyId, key, value); result = 31 * result + Arrays.hashCode(key);
result = 31 * result + Arrays.hashCode(value);
return result;
} }
} }