in datasketches-memory-java8/src/main/java/org/apache/datasketches/memory/internal/XxHash64.java [79:172]
static long hash(final Object unsafeObj, long cumOffsetBytes, final long lengthBytes,
final long seed) {
long hash;
long remaining = lengthBytes;
if (remaining >= 32) {
long v1 = seed + P1 + P2;
long v2 = seed + P2;
long v3 = seed;
long v4 = seed - P1;
do {
v1 += unsafe.getLong(unsafeObj, cumOffsetBytes) * P2;
v1 = Long.rotateLeft(v1, 31);
v1 *= P1;
v2 += unsafe.getLong(unsafeObj, cumOffsetBytes + 8L) * P2;
v2 = Long.rotateLeft(v2, 31);
v2 *= P1;
v3 += unsafe.getLong(unsafeObj, cumOffsetBytes + 16L) * P2;
v3 = Long.rotateLeft(v3, 31);
v3 *= P1;
v4 += unsafe.getLong(unsafeObj, cumOffsetBytes + 24L) * P2;
v4 = Long.rotateLeft(v4, 31);
v4 *= P1;
cumOffsetBytes += 32;
remaining -= 32;
} while (remaining >= 32);
hash = Long.rotateLeft(v1, 1)
+ Long.rotateLeft(v2, 7)
+ Long.rotateLeft(v3, 12)
+ Long.rotateLeft(v4, 18);
v1 *= P2;
v1 = Long.rotateLeft(v1, 31);
v1 *= P1;
hash ^= v1;
hash = (hash * P1) + P4;
v2 *= P2;
v2 = Long.rotateLeft(v2, 31);
v2 *= P1;
hash ^= v2;
hash = (hash * P1) + P4;
v3 *= P2;
v3 = Long.rotateLeft(v3, 31);
v3 *= P1;
hash ^= v3;
hash = (hash * P1) + P4;
v4 *= P2;
v4 = Long.rotateLeft(v4, 31);
v4 *= P1;
hash ^= v4;
hash = (hash * P1) + P4;
} //end remaining >= 32
else {
hash = seed + P5;
}
hash += lengthBytes;
while (remaining >= 8) {
long k1 = unsafe.getLong(unsafeObj, cumOffsetBytes);
k1 *= P2;
k1 = Long.rotateLeft(k1, 31);
k1 *= P1;
hash ^= k1;
hash = (Long.rotateLeft(hash, 27) * P1) + P4;
cumOffsetBytes += 8;
remaining -= 8;
}
if (remaining >= 4) { //treat as unsigned ints
hash ^= (unsafe.getInt(unsafeObj, cumOffsetBytes) & 0XFFFF_FFFFL) * P1;
hash = (Long.rotateLeft(hash, 23) * P2) + P3;
cumOffsetBytes += 4;
remaining -= 4;
}
while (remaining != 0) { //treat as unsigned bytes
hash ^= (unsafe.getByte(unsafeObj, cumOffsetBytes) & 0XFFL) * P5;
hash = Long.rotateLeft(hash, 11) * P1;
--remaining;
++cumOffsetBytes;
}
return finalize(hash);
}