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