Browse Source

MurmurHash3 support for fingerprint processor (#70632)

Dan Hermann 4 years ago
parent
commit
2be24f0bb7

+ 47 - 4
modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/FingerprintProcessor.java

@@ -9,6 +9,7 @@
 package org.elasticsearch.ingest.common;
 
 import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.hash.Murmur3Hasher;
 import org.elasticsearch.common.util.ByteUtils;
 import org.elasticsearch.ingest.AbstractProcessor;
 import org.elasticsearch.ingest.ConfigurationUtils;
@@ -216,7 +217,7 @@ public final class FingerprintProcessor extends AbstractProcessor {
 
     public static final class Factory implements Processor.Factory {
 
-        public static final String[] SUPPORTED_DIGESTS = { "MD5", "SHA-1", "SHA-256", "SHA-512" };
+        public static final String[] SUPPORTED_DIGESTS = { "MD5", "SHA-1", "SHA-256", "SHA-512", MurmurHasher.METHOD };
 
         static final String DEFAULT_TARGET = "fingerprint";
         static final String DEFAULT_SALT = "";
@@ -284,9 +285,13 @@ public final class FingerprintProcessor extends AbstractProcessor {
             this.md = md;
         }
 
-        static MessageDigestHasher getInstance(String method) throws NoSuchAlgorithmException {
-            MessageDigest md = MessageDigest.getInstance(method);
-            return new MessageDigestHasher(md);
+        static Hasher getInstance(String method) throws NoSuchAlgorithmException {
+            if (method.equalsIgnoreCase(MurmurHasher.METHOD)) {
+                return MurmurHasher.getInstance(method);
+            } else {
+                MessageDigest md = MessageDigest.getInstance(method);
+                return new MessageDigestHasher(md);
+            }
         }
 
         @Override
@@ -309,4 +314,42 @@ public final class FingerprintProcessor extends AbstractProcessor {
             return md.getAlgorithm();
         }
     }
+
+    static class MurmurHasher implements Hasher {
+
+        public static final String METHOD = Murmur3Hasher.METHOD;
+        private final Murmur3Hasher mh;
+
+        private MurmurHasher() {
+            this.mh = new Murmur3Hasher(0);
+        }
+
+        static Hasher getInstance(String method) throws NoSuchAlgorithmException {
+            if (method.equalsIgnoreCase(METHOD) == false) {
+                throw new NoSuchAlgorithmException("supports only [" + METHOD + "] as method");
+            }
+            return new MurmurHasher();
+        }
+
+        @Override
+        public void reset() {
+            mh.reset();
+        }
+
+        @Override
+        public void update(byte[] input) {
+            mh.update(input);
+        }
+
+        @Override
+        public byte[] digest() {
+            return mh.digest();
+        }
+
+        @Override
+        public String getAlgorithm() {
+            return mh.getAlgorithm();
+        }
+    }
+
 }

+ 2 - 1
modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/FingerprintProcessorTests.java

@@ -243,7 +243,8 @@ public class FingerprintProcessorTests extends ESTestCase {
             "b+3QyaPYdnUF1lb5IKE+1g==",
             "SX/93t223OurJvgMUOCtSl9hcpg=",
             "zDQYTy34tBlmNedlDdn++N7NN+wBY15mCoPDINmUxXc=",
-            "xNIpYyJzRmg5R0T44ZORC2tgh8N4tVtTFzD5AdBqxmdOuRUjibQQ64lgefkbuZFl8Hv9ze9U6PAmrlgJPcRPGA=="
+            "xNIpYyJzRmg5R0T44ZORC2tgh8N4tVtTFzD5AdBqxmdOuRUjibQQ64lgefkbuZFl8Hv9ze9U6PAmrlgJPcRPGA==",
+            "yjfaOoy2UQ3EHZRAzFK9sw=="
         );
 
         var inputMap = new LinkedHashMap<String, Object>();

+ 3 - 1
server/src/main/java/org/elasticsearch/common/hash/Murmur3Hasher.java

@@ -20,6 +20,8 @@ import org.elasticsearch.common.Numbers;
  */
 public class Murmur3Hasher {
 
+    public static final String METHOD = "MurmurHash3";
+
     private final long seed;
     private final byte[] remainder = new byte[16];
     private int remainderLength = 0;
@@ -91,7 +93,7 @@ public class Murmur3Hasher {
     }
 
     public String getAlgorithm() {
-        return "MurmurHash3_x64_128";
+        return METHOD;
     }
 
     /**