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