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## method.
Note: when using a customHashing, make sure to use it with theEquiv such that if any two objects are equal, then their hash codes must be equal.