stable_hash/impls/
mod.rs

1mod bool;
2mod floats;
3mod hash_map;
4mod hash_set;
5mod ints;
6mod option;
7mod string;
8mod tuple;
9mod vec;
10
11use crate::prelude::*;
12
13pub(self) fn unordered_unique_stable_hash<H: StableHasher>(
14    items: impl Iterator<Item = impl StableHash>,
15    field_address: H::Addr,
16    state: &mut H,
17) {
18    profile_fn!(unordered_unique_stable_hash);
19
20    for member in items {
21        // Must create an independent hasher to "break" relationship between
22        // independent field addresses.
23        // See also a817fb02-7c77-41d6-98e4-dee123884287
24        let mut new_hasher = H::new();
25        let (a, b) = field_address.unordered();
26        member.stable_hash(a, &mut new_hasher);
27        state.write(b, new_hasher.to_bytes().as_ref());
28    }
29}
30
31impl<'a, T: StableHash> StableHash for &'a T {
32    #[inline]
33    fn stable_hash<H: StableHasher>(&self, field_address: H::Addr, state: &mut H) {
34        profile_method!(stable_hash);
35
36        (*self).stable_hash(field_address, state)
37    }
38}