--- /dev/null
+package org.simantics.scl.compiler.internal.types;
+
+/**
+ * Utils for computing 32-bit Murmur3 hash function
+ */
+public class HashCodeUtils {
+
+ private static final int C1 = 0xcc9e2d51;
+ private static final int C2 = 0x1b873593;
+ private static final int R1 = 15;
+ private static final int R2 = 13;
+ private static final int M = 5;
+ private static final int N = 0xe6546b64;
+
+ public static final int SEED = 0;
+
+ public static int update(int hash, int value) {
+ value *= C1;
+ value = Integer.rotateLeft(value, R1);
+ value *= C2;
+
+ hash ^= value;
+ return Integer.rotateLeft(hash, R2) * M + N;
+ }
+
+ public static int preprocessValue(int value) {
+ value *= C1;
+ value = Integer.rotateLeft(value, R1);
+ value *= C2;
+ return value;
+ }
+
+ public static int updateWithPreprocessedValue(int hash, int preprocessedValue) {
+ hash ^= preprocessedValue;
+ return Integer.rotateLeft(hash, R2) * M + N;
+ }
+
+ public static int finalize(int hash) {
+ hash ^= hash >> 16;
+ hash *= 0x85ebca6b;
+ hash ^= hash >> 13;
+ hash *= 0xc2b2ae35;
+ hash ^= hash >> 16;
+ return hash;
+ }
+}