pub trait HashStable<CTX> {
// Required method
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher);
}Expand description
Something that implements HashStable<CTX> can be hashed in a way that is
stable across multiple compilation sessions.
Note that HashStable imposes rather more strict requirements than usual
hash functions:
-
Stable hashes are sometimes used as identifiers. Therefore they must conform to the corresponding
PartialEqimplementations:x == yimplieshash_stable(x) == hash_stable(y), andx != yimplieshash_stable(x) != hash_stable(y).
That second condition is usually not required for hash functions (e.g.
Hash). In practice this means thathash_stablemust feed any information into the hasher that aPartialEqcomparison 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. TheStableHashertakes care of endianness andisize/usizeplatform differences.