Current C++ standard dictates impementation of user-defined types hashing through specialization of std::hash
type.
This causes tight coupling between hashing method for conctete type and overall algorithm of turning type's significant bytes
to hash value. One of consequences is constant reinvention of hash values combination in user code. Other consequence
is that client code cannot use custom hashing algorithm without rewriting std::hash
implementation for all components
of user-defined type, down to primitive ones.
This document describes way to define and substitute hashing algorithm separate from hashing method for concrete type. Design is inspired by Rust's Hasher trait.