diff --git a/docs/changelog/133193.yaml b/docs/changelog/133193.yaml new file mode 100644 index 0000000000000..57b286abd9ef5 --- /dev/null +++ b/docs/changelog/133193.yaml @@ -0,0 +1,5 @@ +pr: 133193 +summary: Fix offset handling in Murmur3Hasher +area: Infra/Core +type: bug +issues: [] diff --git a/server/src/main/java/org/elasticsearch/common/hash/Murmur3Hasher.java b/server/src/main/java/org/elasticsearch/common/hash/Murmur3Hasher.java index aec28484138fb..90d40f1ce6d34 100644 --- a/server/src/main/java/org/elasticsearch/common/hash/Murmur3Hasher.java +++ b/server/src/main/java/org/elasticsearch/common/hash/Murmur3Hasher.java @@ -75,7 +75,7 @@ public void update(byte[] inputBytes, int offset, int length) { System.arraycopy(inputBytes, offset + numBytesToHash, remainder, 0, remainderLength); } } else { - System.arraycopy(inputBytes, 0, remainder, remainderLength, length); + System.arraycopy(inputBytes, offset, remainder, remainderLength, length); remainderLength += length; } } diff --git a/server/src/test/java/org/elasticsearch/common/hashing/Murmur3HasherTests.java b/server/src/test/java/org/elasticsearch/common/hashing/Murmur3HasherTests.java index c29dd45d0752e..a426dd876bd5e 100644 --- a/server/src/test/java/org/elasticsearch/common/hashing/Murmur3HasherTests.java +++ b/server/src/test/java/org/elasticsearch/common/hashing/Murmur3HasherTests.java @@ -35,8 +35,12 @@ private static void assertHash(long lower, long upper, String inputString, long expected.h2 = upper; byte[] bytes = inputString.getBytes(StandardCharsets.UTF_8); + int padding = randomInt(8); + int offset = randomInt(padding); + byte[] paddedBytes = new byte[bytes.length + padding]; + System.arraycopy(bytes, 0, paddedBytes, offset, bytes.length); Murmur3Hasher mh = new Murmur3Hasher(seed); - mh.update(bytes); + mh.update(paddedBytes, offset, bytes.length); MurmurHash3.Hash128 actual = mh.digestHash(); assertHash(expected, actual); }