rustc_data_structures/
unhash.rs

1use std::collections::{HashMap, HashSet};
2use std::hash::{BuildHasherDefault, Hasher};
3
4pub type UnhashMap<K, V> = HashMap<K, V, BuildHasherDefault<Unhasher>>;
5pub type UnhashSet<V> = HashSet<V, BuildHasherDefault<Unhasher>>;
6pub type UnindexMap<K, V> = indexmap::IndexMap<K, V, BuildHasherDefault<Unhasher>>;
7
8/// This no-op hasher expects only a single `write_u64` call. It's intended for
9/// map keys that already have hash-like quality, like `Fingerprint`.
10#[derive(Default)]
11pub struct Unhasher {
12    value: u64,
13}
14
15impl Hasher for Unhasher {
16    #[inline]
17    fn finish(&self) -> u64 {
18        self.value
19    }
20
21    fn write(&mut self, _bytes: &[u8]) {
22        unimplemented!("use write_u64");
23    }
24
25    #[inline]
26    fn write_u64(&mut self, value: u64) {
27        debug_assert_eq!(0, self.value, "Unhasher doesn't mix values!");
28        self.value = value;
29    }
30}