1 use core::hash::Hasher;
2 
3 use digest::{
4     generic_array::{
5         typenum::consts::{U16, U4, U8},
6         GenericArray,
7     },
8     Digest,
9 };
10 
11 use crate::{xxh3, XxHash32, XxHash64};
12 
13 impl Digest for XxHash32 {
14     type OutputSize = U4;
15 
new() -> Self16     fn new() -> Self {
17         Self::default()
18     }
19 
input<B: AsRef<[u8]>>(&mut self, data: B)20     fn input<B: AsRef<[u8]>>(&mut self, data: B) {
21         self.write(data.as_ref());
22     }
23 
chain<B: AsRef<[u8]>>(mut self, data: B) -> Self where Self: Sized,24     fn chain<B: AsRef<[u8]>>(mut self, data: B) -> Self
25     where
26         Self: Sized,
27     {
28         self.input(data);
29         self
30     }
31 
result(self) -> GenericArray<u8, Self::OutputSize>32     fn result(self) -> GenericArray<u8, Self::OutputSize> {
33         self.finish().to_be_bytes().into()
34     }
35 
result_reset(&mut self) -> GenericArray<u8, Self::OutputSize>36     fn result_reset(&mut self) -> GenericArray<u8, Self::OutputSize> {
37         let result = self.result();
38         self.reset();
39         result
40     }
41 
reset(&mut self)42     fn reset(&mut self) {
43         *self = Self::default();
44     }
45 
output_size() -> usize46     fn output_size() -> usize {
47         4
48     }
49 
digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize>50     fn digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize> {
51         Self::new().chain(data).result()
52     }
53 }
54 
55 impl Digest for XxHash64 {
56     type OutputSize = U8;
57 
new() -> Self58     fn new() -> Self {
59         Self::default()
60     }
61 
input<B: AsRef<[u8]>>(&mut self, data: B)62     fn input<B: AsRef<[u8]>>(&mut self, data: B) {
63         self.write(data.as_ref());
64     }
65 
chain<B: AsRef<[u8]>>(mut self, data: B) -> Self where Self: Sized,66     fn chain<B: AsRef<[u8]>>(mut self, data: B) -> Self
67     where
68         Self: Sized,
69     {
70         self.input(data);
71         self
72     }
73 
result(self) -> GenericArray<u8, Self::OutputSize>74     fn result(self) -> GenericArray<u8, Self::OutputSize> {
75         self.finish().to_be_bytes().into()
76     }
77 
result_reset(&mut self) -> GenericArray<u8, Self::OutputSize>78     fn result_reset(&mut self) -> GenericArray<u8, Self::OutputSize> {
79         let result = self.result();
80         self.reset();
81         result
82     }
83 
reset(&mut self)84     fn reset(&mut self) {
85         *self = Self::default();
86     }
87 
output_size() -> usize88     fn output_size() -> usize {
89         8
90     }
91 
digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize>92     fn digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize> {
93         Self::new().chain(data).result()
94     }
95 }
96 
97 impl Digest for xxh3::Hash64 {
98     type OutputSize = U8;
99 
new() -> Self100     fn new() -> Self {
101         Self::default()
102     }
103 
input<B: AsRef<[u8]>>(&mut self, data: B)104     fn input<B: AsRef<[u8]>>(&mut self, data: B) {
105         self.write(data.as_ref());
106     }
107 
chain<B: AsRef<[u8]>>(mut self, data: B) -> Self where Self: Sized,108     fn chain<B: AsRef<[u8]>>(mut self, data: B) -> Self
109     where
110         Self: Sized,
111     {
112         self.input(data);
113         self
114     }
115 
result(self) -> GenericArray<u8, Self::OutputSize>116     fn result(self) -> GenericArray<u8, Self::OutputSize> {
117         self.finish().to_be_bytes().into()
118     }
119 
result_reset(&mut self) -> GenericArray<u8, Self::OutputSize>120     fn result_reset(&mut self) -> GenericArray<u8, Self::OutputSize> {
121         let result = self.clone().result();
122         self.reset();
123         result
124     }
125 
reset(&mut self)126     fn reset(&mut self) {
127         *self = Self::default();
128     }
129 
output_size() -> usize130     fn output_size() -> usize {
131         8
132     }
133 
digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize>134     fn digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize> {
135         Self::new().chain(data).result()
136     }
137 }
138 
139 impl Digest for xxh3::Hash128 {
140     type OutputSize = U16;
141 
new() -> Self142     fn new() -> Self {
143         Self::default()
144     }
145 
input<B: AsRef<[u8]>>(&mut self, data: B)146     fn input<B: AsRef<[u8]>>(&mut self, data: B) {
147         self.write(data.as_ref());
148     }
149 
chain<B: AsRef<[u8]>>(mut self, data: B) -> Self where Self: Sized,150     fn chain<B: AsRef<[u8]>>(mut self, data: B) -> Self
151     where
152         Self: Sized,
153     {
154         self.input(data);
155         self
156     }
157 
result(self) -> GenericArray<u8, Self::OutputSize>158     fn result(self) -> GenericArray<u8, Self::OutputSize> {
159         xxh3::HasherExt::finish_ext(&self).to_be_bytes().into()
160     }
161 
result_reset(&mut self) -> GenericArray<u8, Self::OutputSize>162     fn result_reset(&mut self) -> GenericArray<u8, Self::OutputSize> {
163         let result = self.clone().result();
164         self.reset();
165         result
166     }
167 
reset(&mut self)168     fn reset(&mut self) {
169         *self = Self::default();
170     }
171 
output_size() -> usize172     fn output_size() -> usize {
173         8
174     }
175 
digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize>176     fn digest(data: &[u8]) -> GenericArray<u8, Self::OutputSize> {
177         Self::new().chain(data).result()
178     }
179 }
180