code: private long getIndex(int key, boolean inserting)
      {
          long extraInfo = EXTRA_INDEX_INFO;
          //D1 
          final int hash = h(key) & INT_MASK;
          int i = hash % keys.length;
          
          //D2
          int satus_i = status[i];
          if((keys[i] == key && satus_i != DELETED) || satus_i == EMPTY)
              return extraInfo | i;
          if(extraInfo == EXTRA_INDEX_INFO && satus_i == DELETED)
              extraInfo = ((long)i) << 32;
          
          //D3
          final int c = 1 + (hash % (keys.length -2));
          
          while(true)//this loop will terminate
          {
              //D4
              i -= c;
              if(i < 0)
                  i += keys.length;
              //D5
              satus_i = status[i];
              if( (keys[i] == key && satus_i != DELETED) || satus_i == EMPTY || (satus_i == DELETED && inserting))
                  return extraInfo | i;
              if(extraInfo == EXTRA_INDEX_INFO && satus_i == DELETED)
                  extraInfo = ((long)i) << 32;
          }
      }
docs: Gets the index of the given key. Based on that {@link #status} variable,
  the index is either the location to insert OR the location of the key.
  
  This method returns 2 integer table in the long. The lower 32 bits are
  the index that either contains the key, or is the first empty index.
  
  The upper 32 bits is the index of the first position marked as
  {@link #DELETED} either {@link Integer#MIN_VALUE} if no position was
  marked as DELETED while searching.
  
  @param key they key to search for
  @param inserting {@code true} if a value is being inserted into the index, false otherwise
  @return the mixed long containing the index of the first DELETED position
  and the position that the key is in or the first EMPTY position found