Hashing is a trait whose instances each represent a strategy for hashing
instances of a type.
Hashing's companion object defines a default hashing strategy for all
objects - it calls their
Note: when using a custom
Hashing, make sure to use it with the
such that if any two objects are equal, then their hash codes must be equal.