1use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
40
41const OFFSET_BASIS: u64 = 0xcbf2_9ce4_8422_2325;
43const PRIME: u64 = 0x0000_0100_0000_01b3;
45
46#[derive(Clone, Debug)]
56pub struct Hasher {
57 state: u64,
58}
59
60impl Hasher {
61 pub fn new() -> Self {
63 Hasher {
64 state: OFFSET_BASIS,
65 }
66 }
67
68 pub fn write(&mut self, bytes: &[u8]) {
70 for byte in bytes {
71 self.state ^= u64::from(*byte);
72 self.state = self.state.wrapping_mul(PRIME);
73 }
74 }
75
76 pub fn write_u64(&mut self, value: u64) {
78 self.write(&value.to_le_bytes());
79 }
80
81 pub fn finish(&self) -> u64 {
83 self.state
84 }
85}
86
87impl Default for Hasher {
88 fn default() -> Self {
89 Hasher::new()
90 }
91}
92
93pub trait Fingerprint {
100 fn fingerprint(&self, hasher: &mut Hasher);
102}
103
104pub fn fingerprint_of<T: Fingerprint + ?Sized>(value: &T) -> u64 {
113 let mut hasher = Hasher::new();
114 value.fingerprint(&mut hasher);
115 hasher.finish()
116}
117
118macro_rules! fingerprint_le_bytes {
119 ($($ty:ty),* $(,)?) => {
120 $(
121 impl Fingerprint for $ty {
122 fn fingerprint(&self, hasher: &mut Hasher) {
123 hasher.write(&self.to_le_bytes());
124 }
125 }
126 )*
127 };
128}
129
130fingerprint_le_bytes!(u8, u16, u32, u64, u128, i8, i16, i32, i64, i128);
131
132macro_rules! fingerprint_widened {
133 ($($ty:ty => $wide:ty),* $(,)?) => {
134 $(
135 impl Fingerprint for $ty {
136 fn fingerprint(&self, hasher: &mut Hasher) {
137 <$wide as Fingerprint>::fingerprint(&(*self as $wide), hasher);
140 }
141 }
142 )*
143 };
144}
145
146fingerprint_widened!(usize => u64, isize => i64);
147
148impl Fingerprint for bool {
149 fn fingerprint(&self, hasher: &mut Hasher) {
150 hasher.write(&[u8::from(*self)]);
151 }
152}
153
154impl Fingerprint for char {
155 fn fingerprint(&self, hasher: &mut Hasher) {
156 u32::from(*self).fingerprint(hasher);
157 }
158}
159
160impl Fingerprint for f32 {
165 fn fingerprint(&self, hasher: &mut Hasher) {
166 self.to_bits().fingerprint(hasher);
167 }
168}
169
170impl Fingerprint for f64 {
171 fn fingerprint(&self, hasher: &mut Hasher) {
172 self.to_bits().fingerprint(hasher);
173 }
174}
175
176impl Fingerprint for str {
177 fn fingerprint(&self, hasher: &mut Hasher) {
178 hasher.write_u64(self.len() as u64);
180 hasher.write(self.as_bytes());
181 }
182}
183
184impl Fingerprint for String {
185 fn fingerprint(&self, hasher: &mut Hasher) {
186 self.as_str().fingerprint(hasher);
187 }
188}
189
190impl<T: Fingerprint + ?Sized> Fingerprint for &T {
191 fn fingerprint(&self, hasher: &mut Hasher) {
192 (**self).fingerprint(hasher);
193 }
194}
195
196impl<T: Fingerprint + ?Sized> Fingerprint for Box<T> {
197 fn fingerprint(&self, hasher: &mut Hasher) {
198 (**self).fingerprint(hasher);
199 }
200}
201
202impl<T: Fingerprint> Fingerprint for Option<T> {
203 fn fingerprint(&self, hasher: &mut Hasher) {
204 match self {
205 None => hasher.write(&[0]),
206 Some(value) => {
207 hasher.write(&[1]);
208 value.fingerprint(hasher);
209 }
210 }
211 }
212}
213
214impl<T: Fingerprint, E: Fingerprint> Fingerprint for Result<T, E> {
215 fn fingerprint(&self, hasher: &mut Hasher) {
216 match self {
217 Ok(value) => {
218 hasher.write(&[0]);
219 value.fingerprint(hasher);
220 }
221 Err(error) => {
222 hasher.write(&[1]);
223 error.fingerprint(hasher);
224 }
225 }
226 }
227}
228
229impl<T: Fingerprint> Fingerprint for [T] {
230 fn fingerprint(&self, hasher: &mut Hasher) {
231 hasher.write_u64(self.len() as u64);
232 for item in self {
233 item.fingerprint(hasher);
234 }
235 }
236}
237
238impl<T: Fingerprint> Fingerprint for Vec<T> {
239 fn fingerprint(&self, hasher: &mut Hasher) {
240 self.as_slice().fingerprint(hasher);
241 }
242}
243
244impl Fingerprint for () {
245 fn fingerprint(&self, _hasher: &mut Hasher) {}
246}
247
248macro_rules! fingerprint_tuples {
249 ($(($($index:tt $param:ident),+))+) => {
250 $(
251 impl<$($param: Fingerprint),+> Fingerprint for ($($param,)+) {
252 fn fingerprint(&self, hasher: &mut Hasher) {
253 $(self.$index.fingerprint(hasher);)+
254 }
255 }
256 )+
257 };
258}
259
260fingerprint_tuples! {
261 (0 A)
262 (0 A, 1 B)
263 (0 A, 1 B, 2 C)
264 (0 A, 1 B, 2 C, 3 D)
265 (0 A, 1 B, 2 C, 3 D, 4 E)
266 (0 A, 1 B, 2 C, 3 D, 4 E, 5 F)
267}
268
269fn fingerprint_unordered<I, F>(hasher: &mut Hasher, len: usize, items: I, mut each: F)
275where
276 F: FnMut(&mut Hasher, I::Item),
277 I: Iterator,
278{
279 let mut combined = 0u64;
280 for item in items {
281 let mut element = Hasher::new();
282 each(&mut element, item);
283 combined ^= element.finish();
284 }
285 hasher.write_u64(len as u64);
286 hasher.write_u64(combined);
287}
288
289impl<T: Fingerprint, S> Fingerprint for HashSet<T, S> {
290 fn fingerprint(&self, hasher: &mut Hasher) {
291 fingerprint_unordered(hasher, self.len(), self.iter(), |h, item| {
292 item.fingerprint(h)
293 });
294 }
295}
296
297impl<T: Fingerprint> Fingerprint for BTreeSet<T> {
298 fn fingerprint(&self, hasher: &mut Hasher) {
299 fingerprint_unordered(hasher, self.len(), self.iter(), |h, item| {
300 item.fingerprint(h)
301 });
302 }
303}
304
305impl<K: Fingerprint, V: Fingerprint, S> Fingerprint for HashMap<K, V, S> {
306 fn fingerprint(&self, hasher: &mut Hasher) {
307 fingerprint_unordered(hasher, self.len(), self.iter(), |h, (key, value)| {
308 key.fingerprint(h);
309 value.fingerprint(h);
310 });
311 }
312}
313
314impl<K: Fingerprint, V: Fingerprint> Fingerprint for BTreeMap<K, V> {
315 fn fingerprint(&self, hasher: &mut Hasher) {
316 fingerprint_unordered(hasher, self.len(), self.iter(), |h, (key, value)| {
317 key.fingerprint(h);
318 value.fingerprint(h);
319 });
320 }
321}