code: def _get_hashtable_algo(values):
      
      values, dtype, ndtype = _ensure_data(values)
  
      if ndtype == 'object':
  
          # it's cheaper to use a String Hash Table than Object; we infer
          # including nulls because that is the only difference between
          # StringHashTable and ObjectHashtable
          if lib.infer_dtype(values, skipna=False) in ['string']:
              ndtype = 'string'
          else:
              ndtype = 'object'
  
      htable, table = _hashtables[ndtype]
      return (htable, table, values, dtype, ndtype)
docs: Parameters
      ----------
      values : arraylike
  
      Returns
      -------
      tuples(hashtable class,
             vector class,
             values,
             dtype,
             ndtype)