axhash_core/hasher/
trait_impl.rs1use super::AxHasher;
2
3use crate::backend::hash_bytes_core;
4use crate::constants::SECRET;
5use crate::math::{avalanche, folded_multiply};
6
7use core::hash::Hasher;
8
9impl Hasher for AxHasher {
10 #[inline(always)]
11 fn finish(&self) -> u64 {
12 let final_acc = if self.sponge_bits == 0 {
13 self.acc
14 } else {
15 let lo = self.sponge as u64;
16 let hi = (self.sponge >> 64) as u64;
17 folded_multiply(lo ^ self.acc, hi ^ SECRET[1])
18 };
19 avalanche(final_acc)
20 }
21
22 #[inline(always)]
23 fn write(&mut self, bytes: &[u8]) {
24 self.flush_sponge();
25 self.acc = hash_bytes_core(bytes, self.acc);
26 }
27
28 #[inline(always)]
29 fn write_u8(&mut self, i: u8) {
30 self.push_num(i, 8);
31 }
32
33 #[inline(always)]
34 fn write_u16(&mut self, i: u16) {
35 self.push_num(i, 16);
36 }
37
38 #[inline(always)]
39 fn write_u32(&mut self, i: u32) {
40 self.flush_sponge();
41
42 self.acc = folded_multiply(self.acc ^ i as u64, SECRET[1]);
43 }
44
45 #[inline(always)]
46 fn write_u64(&mut self, i: u64) {
47 self.flush_sponge();
48
49 self.acc = folded_multiply(self.acc ^ i, SECRET[1]);
50 }
51
52 #[inline(always)]
53 fn write_u128(&mut self, i: u128) {
54 self.flush_sponge();
55 let lo = i as u64;
56 let hi = (i >> 64) as u64;
57 self.acc = folded_multiply(lo ^ self.acc, hi ^ SECRET[1]);
58 }
59
60 #[inline(always)]
61 fn write_usize(&mut self, i: usize) {
62 #[cfg(target_pointer_width = "32")]
63 self.write_u32(i as u32);
64 #[cfg(target_pointer_width = "64")]
65 self.write_u64(i as u64);
66 }
67
68 #[inline(always)]
69 fn write_i8(&mut self, i: i8) {
70 self.write_u8(i as u8);
71 }
72
73 #[inline(always)]
74 fn write_i16(&mut self, i: i16) {
75 self.write_u16(i as u16);
76 }
77
78 #[inline(always)]
79 fn write_i32(&mut self, i: i32) {
80 self.write_u32(i as u32);
81 }
82
83 #[inline(always)]
84 fn write_i64(&mut self, i: i64) {
85 self.write_u64(i as u64);
86 }
87
88 #[inline(always)]
89 fn write_i128(&mut self, i: i128) {
90 self.write_u128(i as u128);
91 }
92
93 #[inline(always)]
94 fn write_isize(&mut self, i: isize) {
95 self.write_usize(i as usize);
96 }
97}