docs: private long murmur(ByteBuffer data) {
      int offset = data.position();
      int length = data.remaining();
  
      int nblocks = length >> 4; // Process as 128-bit blocks.
  
      long h1 = 0;
      long h2 = 0;
  
      long c1 = 0x87c37b91114253d5L;
      long c2 = 0x4cf5ad432745937fL;
  
      // ----------
      // body
  
      for (int i = 0; i < nblocks; i++) {
        long k1 = getblock(data, offset, i * 2);
        long k2 = getblock(data, offset, i * 2 + 1);
  
        k1 *= c1;
        k1 = rotl64(k1, 31);
        k1 *= c2;
        h1 ^= k1;
        h1 = rotl64(h1, 27);
        h1 += h2;
        h1 = h1 * 5 + 0x52dce729;
        k2 *= c2;
        k2 = rotl64(k2, 33);
        k2 *= c1;
        h2 ^= k2;
        h2 = rotl64(h2, 31);
        h2 += h1;
        h2 = h2 * 5 + 0x38495ab5;
      }
  
      // ----------
      // tail
  
      // Advance offset to the unprocessed tail of the data.
      offset += nblocks * 16;
  
      long k1 = 0;
      long k2 = 0;
  
      switch (length & 15) {
        case 15:
          k2 ^= ((long) data.get(offset + 14)) << 48;
          // fall through
        case 14:
          k2 ^= ((long) data.get(offset + 13)) << 40;
          // fall through
        case 13:
          k2 ^= ((long) data.get(offset + 12)) << 32;
          // fall through
        case 12:
          k2 ^= ((long) data.get(offset + 11)) << 24;
          // fall through
        case 11:
          k2 ^= ((long) data.get(offset + 10)) << 16;
          // fall through
        case 10:
          k2 ^= ((long) data.get(offset + 9)) << 8;
          // fall through
        case 9:
          k2 ^= ((long) data.get(offset + 8));
          k2 *= c2;
          k2 = rotl64(k2, 33);
          k2 *= c1;
          h2 ^= k2;
          // fall through
        case 8:
          k1 ^= ((long) data.get(offset + 7)) << 56;
          // fall through
        case 7:
          k1 ^= ((long) data.get(offset + 6)) << 48;
          // fall through
        case 6:
          k1 ^= ((long) data.get(offset + 5)) << 40;
          // fall through
        case 5:
          k1 ^= ((long) data.get(offset + 4)) << 32;
          // fall through
        case 4:
          k1 ^= ((long) data.get(offset + 3)) << 24;
          // fall through
        case 3:
          k1 ^= ((long) data.get(offset + 2)) << 16;
          // fall through
        case 2:
          k1 ^= ((long) data.get(offset + 1)) << 8;
          // fall through
        case 1:
          k1 ^= ((long) data.get(offset));
          k1 *= c1;
          k1 = rotl64(k1, 31);
          k1 *= c2;
          h1 ^= k1;
      }
  
      // ----------
      // finalization
  
      h1 ^= length;
      h2 ^= length;
  
      h1 += h2;
      h2 += h1;
  
      h1 = fmix(h1);
      h2 = fmix(h2);
  
      h1 += h2;
  
      return h1;
    }