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

Reply via email to