This module defines a class, Hashable, for types that can be
converted to a hash value. This class exists for the benefit of
hashing-based data structures. The module provides instances for
basic types and a way to combine hash values.

The hash function should be as collision-free as possible, which
means that the hash function must map the inputs to the hash
values as evenly as possible.

This integer need not remain consistent from one execution
of an application to another execution of the same
application.

If two values are equal according to the == method, then
applying the hash method on each of the two values must
produce the same integer result.

It is not required that if two values are unequal
according to the == method, then applying the hash
method on each of the two values must produce distinct
integer results. However, the programmer should be aware
that producing distinct integer results for unequal values
may improve the performance of hashing-based data
structures.

Creating new instances

The functions below can be used when creating new instances of
Hashable. For example, for many string-like types the
hashWithSalt method can be defined in terms of either
hashPtrWithSalt or hashByteArrayWithSalt. Here's how you could
implement an instance for the ByteString data type, from the
bytestring package: