diff options
Diffstat (limited to 'vespajlib/src/main/java/com')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java b/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java index f841b7757fb..1346ee7cf46 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/TensorAddress.java @@ -3,7 +3,10 @@ package com.yahoo.tensor; import com.yahoo.tensor.impl.NumericTensorAddress; import com.yahoo.tensor.impl.StringTensorAddress; +import net.jpountz.xxhash.XXHash32; +import net.jpountz.xxhash.XXHashFactory; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Objects; import java.util.Optional; @@ -16,6 +19,8 @@ import java.util.Optional; */ public abstract class TensorAddress implements Comparable<TensorAddress> { + private static final XXHash32 hasher = XXHashFactory.fastestJavaInstance().hash32(); + public static TensorAddress of(String[] labels) { return StringTensorAddress.of(labels); } @@ -28,6 +33,8 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { return NumericTensorAddress.of(labels); } + private int cached_hash = 0; + /** Returns the number of labels in this */ public abstract int size(); @@ -62,12 +69,17 @@ public abstract class TensorAddress implements Comparable<TensorAddress> { @Override public int hashCode() { - int result = 1; + if (cached_hash != 0) return cached_hash; + + int hash = 0; for (int i = 0; i < size(); i++) { - if (label(i) != null) - result = 31 * result + label(i).hashCode(); + String label = label(i); + if (label != null) { + byte [] buf = label.getBytes(StandardCharsets.UTF_8); + hash = hasher.hash(buf, 0, buf.length, hash); + } } - return result; + return cached_hash = hash; } @Override |