def _update_hasher(hasher, data):
    if isinstance(data, (tuple, list, zip)):
        needs_iteration = True
    elif (util_type.HAVE_NUMPY and isinstance(data, np.ndarray) and
          data.dtype.kind == 'O'):
        needs_iteration = True
    else:
        needs_iteration = False
    if needs_iteration:
        SEP = b'SEP'
        iter_prefix = b'ITER'
        iter_ = iter(data)
        hasher.update(iter_prefix)
        try:
            for item in iter_:
                prefix, hashable = _covert_to_hashable(data)
                binary_data = SEP + prefix + hashable
                hasher.update(binary_data)
        except TypeError:
            _update_hasher(hasher, item)
            for item in iter_:
                hasher.update(SEP)
                _update_hasher(hasher, item)
    else:
        prefix, hashable = _covert_to_hashable(data)
        binary_data = prefix + hashable
        hasher.update(binary_data)