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