def hash_iterable(it):
    """Perform a O(1) memory hash of an iterable of arbitrary length.

	hash(tuple(it)) creates a temporary tuple containing all values from it
	which could be a problem if it is large.

	See discussion at:
	https://groups.google.com/forum/#!msg/python-ideas/XcuC01a8SYs/e-doB9TbDwAJ
	"""
    hash_value = hash(type(it))
    for value in it:
        hash_value = hash((hash_value, value))
    return hash_value
