code: def hash_tuples(vals, encoding='utf8', hash_key=None):
      
      is_tuple = False
      if isinstance(vals, tuple):
          vals = [vals]
          is_tuple = True
      elif not is_list_like(vals):
          raise TypeError("must be convertible to a list-of-tuples")
  
      from pandas import Categorical, MultiIndex
  
      if not isinstance(vals, ABCMultiIndex):
          vals = MultiIndex.from_tuples(vals)
  
      # create a list-of-Categoricals
      vals = [Categorical(vals.codes[level],
                          vals.levels[level],
                          ordered=False,
                          fastpath=True)
              for level in range(vals.nlevels)]
  
      # hash the list-of-ndarrays
      hashes = (_hash_categorical(cat,
                                  encoding=encoding,
                                  hash_key=hash_key)
                for cat in vals)
      h = _combine_hash_arrays(hashes, len(vals))
      if is_tuple:
          h = h[0]
  
      return h
docs: Hash an MultiIndex / list-of-tuples efficiently
  
      .. versionadded:: 0.20.0
  
      Parameters
      ----------
      vals : MultiIndex, list-of-tuples, or single tuple
      encoding : string, default 'utf8'
      hash_key : string key to encode, default to _default_hash_key
  
      Returns
      -------
      ndarray of hashed values array