code: public static int hashSearch(final long[] hashTable, final int lgArrLongs, final long hash) {
      if (hash == 0) {
        throw new SketchesArgumentException("Given hash cannot be zero: " + hash);
      }
      final int arrayMask = (1 << lgArrLongs) - 1; // current Size -1
      final int stride = getStride(hash, lgArrLongs);
      int curProbe = (int) (hash & arrayMask);
  
      // search for duplicate or empty slot
      final int loopIndex = curProbe;
      do {
        final long arrVal = hashTable[curProbe];
        if (arrVal == EMPTY) {
          return -1; // not found
        } else if (arrVal == hash) {
          return curProbe; // found
        }
        curProbe = (curProbe + stride) & arrayMask;
      } while (curProbe != loopIndex);
      return -1;
    }
docs: This is a classical Knuth-style Open Addressing, Double Hash search scheme for on-heap.
  Returns the index if found, -1 if not found.
  
  @param hashTable The hash table to search. Must be a power of 2 in size.
  @param lgArrLongs <a href="{@docRoot}/resources/dictionary.html#lgArrLongs">See lgArrLongs</a>.
  lgArrLongs &le; log2(hashTable.length).
  @param hash A hash value to search for. Must not be zero.
  @return Current probe index if found, -1 if not found.