public static int hashUnsafeWords(Object base, long offset, int lengthInBytes, int seed) {
        // This is based on Guava's `Murmur32_Hasher.processRemaining(ByteBuffer)` method.

        int t = lengthInBytes & 0xFFFF_FFFC;
        int h1 = seed;
        for (int i = 0; i < t; i += 4) {
            int halfWord = Platform.getInt(base, offset + i);
            int k1 = mixK1(halfWord);
            h1 = mixH1(h1, k1);
        }

        int l = lengthInBytes & 0x03;
        if (l != 0) {
            // Risk cross memory boundary.
            //int tail = LITTLE_ENDIAN
            //        ? Platform.getByte(base, offset + t) & (0xFFFFFFFF >>> ((4 - l) << 3))
            //        : Platform.getByte(base, offset + t) & (0xFFFFFFFF << ((4 - l) << 3));

            int tail = 0;
            for (int i = t; i < lengthInBytes; i++) {
                tail = (tail << 8) | (Platform.getByte(base, offset + i) & 0xFF);
            }
            int k1 = mixK1(tail);
            h1 = mixH1(h1, k1);
        }

        return fmix(h1, lengthInBytes);
    }
32-bit Murmur3 hasher.  This is based on Guava's Murmur3_32HashFunction.
indexr-common/src/main/java/io/indexr/util/Hasher32.java