Skip to main content

axhash_core/hasher/
trait_impl.rs

1use 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}