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