package at.yawk.numaec;
final class SipHash {
private static final long INIT_V0 = 0x736f6d6570736575L;
private static final long INIT_V1 = 0x646f72616e646f6dL;
private static final long INIT_V2 = 0x6c7967656e657261L;
private static final long INIT_V3 = 0x7465646279746573L;
private static long rotl(long v, int shift) {
return (v << shift) | (v >>> (64 - shift));
}
@SuppressWarnings({ "unused", "ConstantConditions", "UnusedAssignment" })
private static void sipRound() {
long v0 = 0, v1 = 0, v2 = 0, v3 = 0;
throw new AssertionError();
}
@SuppressWarnings({ "StatementWithEmptyBody", "TooBroadScope" })
public static long sipHash2_4_8_to_8(long k0, long k1, long m) {
long v0 = INIT_V0;
long v1 = INIT_V1;
long v2 = INIT_V2;
long v3 = INIT_V3;
v3 ^= k1;
v2 ^= k0;
v1 ^= k1;
v0 ^= k0;
long b = 8L << 56;
v3 ^= m;
for (int i = 0; i < 2; i++) {
v0 += v1;
v1 = rotl(v1, 13);
v1 ^= v0;
v0 = rotl(v0, 32);
v2 += v3;
v3 = rotl(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = rotl(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = rotl(v1, 17);
v1 ^= v2;
v2 = rotl(v2, 32);
}
v0 ^= m;
v3 ^= b;
for (int i = 0; i < 2; i++) {
v0 += v1;
v1 = rotl(v1, 13);
v1 ^= v0;
v0 = rotl(v0, 32);
v2 += v3;
v3 = rotl(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = rotl(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = rotl(v1, 17);
v1 ^= v2;
v2 = rotl(v2, 32);
}
v0 ^= b;
v2 ^= 0xff;
for (int i = 0; i < 4; i++) {
v0 += v1;
v1 = rotl(v1, 13);
v1 ^= v0;
v0 = rotl(v0, 32);
v2 += v3;
v3 = rotl(v3, 16);
v3 ^= v2;
v0 += v3;
v3 = rotl(v3, 21);
v3 ^= v0;
v2 += v1;
v1 = rotl(v1, 17);
v1 ^= v2;
v2 = rotl(v2, 32);
}
return v0 ^ v1 ^ v2 ^ v3;
}
}