code: public static long[] hash(final long[] key, final long seed) {
      final HashState hashState = new HashState(seed, seed);
      final int longs = key.length; //in longs
  
      // Number of full 128-bit blocks of 2 longs (the body).
      // Possible exclusion of a remainder of 1 long.
      final int nblocks = longs >>> 1; //longs / 2
  
      // Process the 128-bit blocks (the body) into the hash
      for (int i = 0; i < nblocks; i++ ) {
        final long k1 = key[i << 1]; //0, 2, 4, ...
        final long k2 = key[(i << 1) + 1]; //1, 3, 5, ...
        hashState.blockMix128(k1, k2);
      }
  
      // Get the tail index, remainder length
      final int tail = nblocks << 1; // 2 longs / block
      final int rem = longs - tail; // remainder longs: 0,1
  
      // Get the tail
      final long k1 = (rem == 0) ? 0 : key[tail]; //k2 -> 0
      // Mix the tail into the hash and return
      return hashState.finalMix128(k1, 0, longs << 3); //convert to bytes
    }
docs: Returns a long array of size 2, which is a 128-bit hash of the input.
  
  @param key The input long[] array. Must be non-null and non-empty.
  @param seed A long valued seed.
  @return the hash.