docs: public static long[] hash(final int[] key, final long seed) {
      final HashState hashState = new HashState(seed, seed);
      final int ints = key.length; //in ints
  
      // Number of full 128-bit blocks of 4 ints.
      // Possible exclusion of a remainder of up to 3 ints.
      final int nblocks = ints >>> 2; //ints / 4
  
      // Process the 128-bit blocks (the body) into the hash
      for (int i = 0; i < nblocks; i++ ) { //4 ints per block
        final long k1 = getLong(key, i << 2, 2); //0, 4, 8, ...
        final long k2 = getLong(key, (i << 2) + 2, 2); //2, 6, 10, ...
        hashState.blockMix128(k1, k2);
      }
  
      // Get the tail index, remainder length
      final int tail = nblocks << 2; // 4 ints per block
      final int rem = ints - tail; // remainder ints: 0,1,2,3
  
      // Get the tail
      final long k1;
      final long k2;
      if (rem > 2) { //k1 -> whole; k2 -> partial
        k1 = getLong(key, tail, 2);
        k2 = getLong(key, tail + 2, rem - 2);
      }
      else { //k1 -> whole, partial or 0; k2 == 0
        k1 = (rem == 0) ? 0 : getLong(key, tail, rem);
        k2 = 0;
      }
      // Mix the tail into the hash and return
      return hashState.finalMix128(k1, k2, ints << 2); //convert to bytes
    }