Something that implements
HashStable<CTX> can be hashed in a way that is
stable across multiple compilation sessions.
HashStable imposes rather more strict requirements than usual
Stable hashes are sometimes used as identifiers. Therefore they must conform to the corresponding
x == yimplies
hash_stable(x) == hash_stable(y), and
x != yimplies
hash_stable(x) != hash_stable(y).
That second condition is usually not required for hash functions (e.g.
Hash). In practice this means that
hash_stablemust feed any information into the hasher that a
PartialEqcomparison takes into account. See #49300 for an example where violating this invariant has caused trouble in the past.
hash_stable()must be independent of the current compilation session. E.g. they must not hash memory addresses or other things that are “randomly” assigned per compilation session.
hash_stable()must be independent of the host architecture. The
StableHashertakes care of endianness and