1#[allow(dead_code)]
2use core::panic;
3use hex::encode;
4use sha1::{Digest, Sha1};
5use std::{
6 collections::{hash_map::DefaultHasher, HashMap},
7 hash::{Hash, Hasher},
8 sync::Arc,
9};
10
11#[derive(Debug, Clone, Default, PartialEq, Eq)]
12pub struct HashSetMap<T> {
13 pub register: HashMap<Arc<[u8]>, Arc<T>>,
14}
15
16pub struct HashSetMapBuilder<T> {
17 pub hash_register: HashSetMap<T>,
18 pub hasher: Option<Arc<dyn Hasher>>,
19}
20
21pub struct Sha1Hasher {
22 pub state: [u8; 20],
23}
24pub struct HsmWithSha1Hasher {
25 pub hsm: HashSetMapBuilder<String>,
26 pub hasher: Sha1Hasher,
27}
28
29#[allow(dead_code)]
30impl<'a, T> HashSetMapBuilder<T>
31where
32 T: Hash + Eq + Clone + Default + ToString,
33 HashSetMapBuilder<T>: Default,
34{
35 pub fn insert(
36 mut self,
37 hasher: &mut Sha1Hasher,
38 input: T,
39 ) -> (Arc<[u8]>, Option<Arc<T>>, Self) {
40 if self.hasher.is_none() {
41 panic!("HashSetMapBuilder::insert() -> hasher is None")
42 };
43 hasher.write(input.to_string().as_bytes());
44 let key = hasher.finish();
45 (
47 key.clone(),
48 self.hash_register.register.insert(key, Arc::new(input)),
49 self,
50 )
51 }
52 pub fn new() -> Self {
53 Default::default()
54 }
55 pub fn new_with_capacity(capacity: usize) -> Self {
56 let mut hash_register = HashSetMap::default();
57 hash_register.register = HashMap::with_capacity(capacity);
58 Self {
59 hash_register,
60 hasher: None,
61 }
62 }
63 pub fn new_with_hasher(hasher: Arc<dyn Hasher>) -> Self {
64 Self {
65 hash_register: Default::default(),
66 hasher: Some(hasher),
67 }
68 }
69 pub fn new_with_capacity_and_hasher(capacity: usize, hasher: Arc<dyn Hasher>) -> Self {
70 let mut hash_register = HashSetMap::default();
71 hash_register.register = HashMap::with_capacity_and_hasher(capacity, Default::default());
72 Self {
73 hash_register,
74 hasher: Some(hasher),
75 }
76 }
77 pub fn build(self) -> HashMap<Arc<String>, Arc<T>> {
78 let mut hash_register = HashMap::with_capacity(self.hash_register.register.len());
79 for (key, value) in self.hash_register.register.into_iter() {
80 hash_register.insert(Arc::new(encode(key.as_ref())), value);
81 }
82 hash_register
83 }
84
85 pub fn with_hasher(mut self, hasher: Arc<dyn Hasher>) -> Self {
86 self.hasher = Some(hasher);
87 self
88 }
89 pub fn hasher(&mut self, hasher: Arc<dyn Hasher>) -> &mut Self {
90 self.hasher = Some(hasher);
91 self
92 }
93
94 pub fn len(&self) -> usize {
95 self.hash_register.register.len()
96 }
97 pub fn is_empty(&self) -> bool {
98 self.hash_register.register.is_empty()
99 }
100 pub fn clear(&mut self) {
101 self.hash_register.register.clear();
102 }
103}
104
105impl<T> Default for HashSetMapBuilder<T>
106where
107 T: Hash + Eq + Clone + Default + ToString,
108{
109 fn default() -> Self {
110 Self {
111 hash_register: HashSetMap {
112 register: HashMap::new(),
113 },
114 hasher: Some(Arc::new(DefaultHasher::new())),
115 }
116 }
117}
118
119#[allow(dead_code)]
120impl Sha1Hasher {
121 pub fn new() -> Self {
122 Self { state: [0; 20] }
123 }
124 pub fn digest(&self, data: &[u8]) -> String {
125 let mut hasher = Sha1Hasher::new();
126 hasher.write(data);
127 encode(hasher.state.as_ref())
128 }
129 pub fn write(&mut self, bytes: &[u8]) {
130 let mut hasher = Sha1::new();
132 hasher.update(bytes);
133 let encode = hasher.finalize();
134 self.state = encode[0..20].try_into().unwrap();
136 }
137
138 pub fn finish(&self) -> Arc<[u8]> {
139 Arc::new(self.state)
140 }
141}
142
143#[allow(dead_code)]
144impl HsmWithSha1Hasher {
145 pub fn new() -> Self {
146 Self {
147 hsm: HashSetMapBuilder::new(),
148 hasher: Sha1Hasher::new(),
149 }
150 }
151 pub fn insert(mut self, input: String) -> (Arc<[u8]>, Option<Arc<String>>, Self) {
152 let key;
153 let previous;
154 (key, previous, self.hsm) = self.hsm.insert(&mut self.hasher, input);
155 (key, previous, self)
156 }
157 pub fn insert_blind(mut self, input: String) -> Self {
158 let _key;
159 let _previous;
160 (_key, _previous, self) = self.insert(input);
161 self
162 }
163 pub fn build(self) -> HashMap<Arc<String>, Arc<String>> {
164 self.hsm.build()
165 }
166}