code: public long getLongByTriple(final long[] triple) {
  		if (n == 0) return defRetValue;
  		final int[] e = new int[3];
  		final int chunk = chunkShift == Long.SIZE ? 0 : (int)(triple[0] >>> chunkShift);
  		final long chunkOffset = offset[chunk];
  		HypergraphSorter.tripleToEdge(triple, seed[chunk], (int)(offset[chunk + 1] - chunkOffset), e);
  		if (e[0] == -1) return defRetValue;
  		final long result = rank(chunkOffset + e[(int)(values.getLong(e[0] + chunkOffset) + values.getLong(e[1] + chunkOffset) + values.getLong(e[2] + chunkOffset)) % 3]);
  		if (signatureMask != 0) return result >= n || signatures.getLong(result) != (triple[0] & signatureMask) ? defRetValue : result;
  		// Out-of-set strings can generate bizarre 3-hyperedges.
  		return result < n ? result : defRetValue;
  	}
docs: Low-level access to the output of this minimal perfect hash function.
  
  <p>This method makes it possible to build several kind of functions on the same {@link ChunkedHashStore} and
  then retrieve the resulting values by generating a single triple of hashes. The method
  {@link TwoStepsMWHCFunction#getLong(Object)} is a good example of this technique.
  
  @param triple a triple generated as documented in {@link ChunkedHashStore}.
  @return the output of the function.