This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-collections.git
The following commit(s) were added to refs/heads/master by this push: new d6eeceb Optimise ObjectsHashIterative hash function. d6eeceb is described below commit d6eeceb01880d970517f31dec9a81e0a3846360e Author: Alex Herbert <aherb...@apache.org> AuthorDate: Tue Mar 17 00:59:00 2020 +0000 Optimise ObjectsHashIterative hash function. Avoid using Arrays.deepHashCode. The array passed to deepHashCode is always length 2. So we can unroll the same computation for the fixed 2 iterations. --- .../bloomfilter/hasher/function/ObjectsHashIterative.java | 9 ++++++++- .../bloomfilter/hasher/function/ObjectsHashIterativeTest.java | 11 +++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterative.java b/src/main/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterative.java index 71e9518..4d958d1 100644 --- a/src/main/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterative.java +++ b/src/main/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterative.java @@ -60,7 +60,14 @@ public final class ObjectsHashIterative implements HashFunction { if (seed == 0) { last = 0; } - final long result = Arrays.deepHashCode(new Object[] { last, buffer }); + // Effectively: + // result = Arrays.deepHashCode(new Object[] { last, buffer }); + // The method loops over items starting with result=1 + // for i in items: + // result = 31 * result + hashCode(i) + // Here we unroll the computation to 2 iterations. + // The computation is done using 32-bit integers then cast to a long + final long result = 31 * (31 + Long.hashCode(last)) + Arrays.hashCode(buffer); last += result; return result; } diff --git a/src/test/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterativeTest.java b/src/test/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterativeTest.java index be50df6..cc01339 100644 --- a/src/test/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterativeTest.java +++ b/src/test/java/org/apache/commons/collections4/bloomfilter/hasher/function/ObjectsHashIterativeTest.java @@ -41,12 +41,11 @@ public class ObjectsHashIterativeTest extends AbstractHashFunctionTest { long l = obj.apply(buffer, 0); long prev = 0; assertEquals(Arrays.deepHashCode(new Object[] {prev, buffer}), l); - prev += l; - l = obj.apply(buffer, 1); - assertEquals(Arrays.deepHashCode(new Object[] {prev, buffer}), l); - prev += l; - l = obj.apply(buffer, 2); - assertEquals(Arrays.deepHashCode(new Object[] {prev, buffer}), l); + for (int i = 1; i <= 5; i++) { + prev += l; + l = obj.apply(buffer, i); + assertEquals(Arrays.deepHashCode(new Object[] {prev, buffer}), l); + } } @Override