1 use core::hash::Hasher;
2 
3 use digest_0_10::{
4     generic_array::typenum::consts::{U16, U4, U8},
5     FixedOutput, HashMarker, Output, OutputSizeUser, Update,
6 };
7 
8 use crate::{xxh3, XxHash32, XxHash64};
9 
10 // ----------
11 
12 impl Update for XxHash32 {
update(&mut self, data: &[u8])13     fn update(&mut self, data: &[u8]) {
14         self.write(data);
15     }
16 }
17 
18 impl OutputSizeUser for XxHash32 {
19     type OutputSize = U4;
20 }
21 
22 impl FixedOutput for XxHash32 {
finalize_into(self, out: &mut Output<Self>)23     fn finalize_into(self, out: &mut Output<Self>) {
24         let tmp: &mut [u8; 4] = out.as_mut();
25         *tmp = self.finish().to_be_bytes();
26     }
27 }
28 
29 impl HashMarker for XxHash32 {}
30 
31 // ----------
32 
33 impl Update for XxHash64 {
update(&mut self, data: &[u8])34     fn update(&mut self, data: &[u8]) {
35         self.write(data);
36     }
37 }
38 
39 impl OutputSizeUser for XxHash64 {
40     type OutputSize = U8;
41 }
42 
43 impl FixedOutput for XxHash64 {
finalize_into(self, out: &mut Output<Self>)44     fn finalize_into(self, out: &mut Output<Self>) {
45         let tmp: &mut [u8; 8] = out.as_mut();
46         *tmp = self.finish().to_be_bytes();
47     }
48 }
49 
50 impl HashMarker for XxHash64 {}
51 
52 // ----------
53 
54 impl Update for xxh3::Hash64 {
update(&mut self, data: &[u8])55     fn update(&mut self, data: &[u8]) {
56         self.write(data);
57     }
58 }
59 
60 impl OutputSizeUser for xxh3::Hash64 {
61     type OutputSize = U8;
62 }
63 
64 impl FixedOutput for xxh3::Hash64 {
finalize_into(self, out: &mut Output<Self>)65     fn finalize_into(self, out: &mut Output<Self>) {
66         let tmp: &mut [u8; 8] = out.as_mut();
67         *tmp = self.finish().to_be_bytes();
68     }
69 }
70 
71 impl HashMarker for xxh3::Hash64 {}
72 
73 // ----------
74 
75 impl Update for xxh3::Hash128 {
update(&mut self, data: &[u8])76     fn update(&mut self, data: &[u8]) {
77         self.write(data);
78     }
79 }
80 
81 impl OutputSizeUser for xxh3::Hash128 {
82     type OutputSize = U16;
83 }
84 
85 impl FixedOutput for xxh3::Hash128 {
finalize_into(self, out: &mut Output<Self>)86     fn finalize_into(self, out: &mut Output<Self>) {
87         let tmp: &mut [u8; 16] = out.as_mut();
88         *tmp = xxh3::HasherExt::finish_ext(&self).to_be_bytes();
89     }
90 }
91 
92 impl HashMarker for xxh3::Hash128 {}
93