*Hashing* is a way to turn data into a single integer value in a way
that seems hard to predict. Hashing is used in hash-tables to obtain
expected constant-time operations when assuming that the hash-function
maps the distribution of the input-keys to a uniform distribution.
While this may not be true in general, in practice hashing often
works very well. In this section we provide a way to combine hash-
values together to form a new hash-value. This allows to find a hash
for an arbitrary complicated object, as long as every part is
recursively hashable.