in src/main/java/org/apache/datasketches/memory/internal/XxHash64.java [67:159]
static long hash(final MemorySegment seg, long offsetBytes, 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 += seg.get(ValueLayout.JAVA_LONG_UNALIGNED, offsetBytes) * P2;
v1 = Long.rotateLeft(v1, 31);
v1 *= P1;
v2 += seg.get(ValueLayout.JAVA_LONG_UNALIGNED, offsetBytes + 8L) * P2;
v2 = Long.rotateLeft(v2, 31);
v2 *= P1;
v3 += seg.get(ValueLayout.JAVA_LONG_UNALIGNED, offsetBytes + 16L) * P2;
v3 = Long.rotateLeft(v3, 31);
v3 *= P1;
v4 += seg.get(ValueLayout.JAVA_LONG_UNALIGNED, offsetBytes + 24L) * P2;
v4 = Long.rotateLeft(v4, 31);
v4 *= P1;
offsetBytes += 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 = seg.get(ValueLayout.JAVA_LONG_UNALIGNED, offsetBytes);
k1 *= P2;
k1 = Long.rotateLeft(k1, 31);
k1 *= P1;
hash ^= k1;
hash = (Long.rotateLeft(hash, 27) * P1) + P4;
offsetBytes += 8;
remaining -= 8;
}
if (remaining >= 4) { //treat as unsigned ints
hash ^= (seg.get(ValueLayout.JAVA_INT_UNALIGNED, offsetBytes) & 0XFFFF_FFFFL) * P1;
hash = (Long.rotateLeft(hash, 23) * P2) + P3;
offsetBytes += 4;
remaining -= 4;
}
while (remaining != 0) { //treat as unsigned bytes
hash ^= (seg.get(ValueLayout.JAVA_BYTE, offsetBytes) & 0XFFL) * P5;
hash = Long.rotateLeft(hash, 11) * P1;
--remaining;
++offsetBytes;
}
return finalize(hash);
}