xorfilter/
hasher.rs

1use std::{
2    collections::hash_map::DefaultHasher,
3    hash::{self, BuildHasher, Hasher},
4};
5
6/// Wrapper type for [std::hash::BuildHasherDefault], that uses
7/// [DefaultHasher] as the hasher.
8#[derive(Clone)]
9pub struct BuildHasherDefault {
10    hasher: hash::BuildHasherDefault<DefaultHasher>,
11}
12
13impl From<BuildHasherDefault> for Vec<u8> {
14    fn from(_: BuildHasherDefault) -> Vec<u8> {
15        vec![]
16    }
17}
18
19impl From<Vec<u8>> for BuildHasherDefault {
20    fn from(_: Vec<u8>) -> BuildHasherDefault {
21        BuildHasherDefault {
22            hasher: hash::BuildHasherDefault::<DefaultHasher>::default(),
23        }
24    }
25}
26
27impl BuildHasher for BuildHasherDefault {
28    type Hasher = DefaultHasher;
29
30    fn build_hasher(&self) -> Self::Hasher {
31        self.hasher.build_hasher()
32    }
33}
34
35impl Default for BuildHasherDefault {
36    fn default() -> Self {
37        BuildHasherDefault {
38            hasher: hash::BuildHasherDefault::<DefaultHasher>::default(),
39        }
40    }
41}
42
43/// NoHash type skips hashing altogether.
44///
45/// When a filter is constructed using NoHash as the type parameter then it is upto
46/// application to generate the 64-bit hash digest outside this library.
47#[derive(Clone)]
48pub struct NoHash;
49
50impl From<NoHash> for Vec<u8> {
51    fn from(_: NoHash) -> Vec<u8> {
52        vec![]
53    }
54}
55
56impl From<Vec<u8>> for NoHash {
57    fn from(_: Vec<u8>) -> NoHash {
58        NoHash
59    }
60}
61
62impl BuildHasher for NoHash {
63    type Hasher = NoHash;
64
65    fn build_hasher(&self) -> Self {
66        NoHash
67    }
68}
69
70impl Default for NoHash {
71    fn default() -> Self {
72        NoHash
73    }
74}
75
76impl Hasher for NoHash {
77    fn write(&mut self, _bytes: &[u8]) {
78        panic!("Can't generate hash digest using NoHash")
79    }
80
81    fn finish(&self) -> u64 {
82        panic!("Can't generate hash digest using NoHash")
83    }
84}