ENH: support MultiIndex and tuple hashing
on top of #15216 

closes #15227 
cc @mikegraham 

I separated this from the prior PR.

yes my goal here is to effectively emulate ``hash(tuple)`` but doing it efficiently (e.g. we already have the arrays in a packed format, turning into python objects, just to compute a tuple hash is very inefficient). @mikegraham 
ok I incorporated your commit (with a slight modification) and now passes tests! ## [Current coverage](https://codecov.io/gh/pandas-dev/pandas/pull/15224?src=pr) is 86.32% (diff: 100%)
> Merging [#15224](https://codecov.io/gh/pandas-dev/pandas/pull/15224?src=pr) into [master](https://codecov.io/gh/pandas-dev/pandas/branch/master?src=pr) will increase coverage by **0.01%**

```diff
@@             master     #15224   diff @@
==========================================
  Files           139        139          
  Lines         51096      51140    +44   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
+ Hits          44103      44148    +45   
+ Misses         6993       6992     -1   
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last update [be32852...8b1d3f9](https://codecov.io/gh/pandas-dev/pandas/compare/be328521b3a5525175b08cb740bb970ccf75727e...8b1d3f9c5718799b5b0f2e1d8069d16fab01324a?src=pr) There were a couple memory improvements in 187573bd490027078cb3d9b4bd9af349675a6a9d over the commit as you cherry-picked it, I think. @mikegraham ahh ok, I will pick-again. thanks! @mikegraham ok fixed.

Note that this obviously returns ``uint64``, so it is not quite compat with the tuplehashing in python? I stole the algorithm, but it's not compatible. I also iterate over the members in forward error rather than reverse...I don't think that is substantive. cc @mikegraham any final comments?

@jorisvandenbossche  We might want to do something about this behavior.

```
>>> pandas.tools.hashing.hash_pandas_object(pandas.DataFrame(), index=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pandas/tools/hashing.py", line 91, in hash_pandas_object
    h = _combine_hash_arrays(hashes, num_items)
  File "pandas/tools/hashing.py", line 19, in _combine_hash_arrays
    first = next(arrays)
StopIteration``` @mikegraham updated