+1
-1
.tangled/workflows/test.yml
+1
-1
.tangled/workflows/test.yml
+4
Cargo.lock
+4
Cargo.lock
+1
-1
Cargo.toml
+1
-1
Cargo.toml
+10
sachy-fnv/Cargo.toml
+10
sachy-fnv/Cargo.toml
+43
sachy-fnv/src/lib.rs
+43
sachy-fnv/src/lib.rs
···
1
+
//! This crate provides a `const` FNV32 hasher for the purpose of supporting the ESPHome/Home Assistant protocol where required.
2
+
//!
3
+
//! ```
4
+
//! use sachy_fnv::fnv32_hash;
5
+
//!
6
+
//! let hash = fnv32_hash("water_pump_1");
7
+
//!
8
+
//! assert_eq!(hash, 3557162331);
9
+
//! ```
10
+
#![no_std]
11
+
12
+
const FNV_OFFSET_BASIS_32: u32 = 0x811c9dc5;
13
+
const FNV_PRIME_32: u32 = 0x01000193;
14
+
15
+
/// `const` FNV32 hasher. Takes a `&str` and returns a `u32` hash.
16
+
pub const fn fnv32_hash(str: &str) -> u32 {
17
+
let bytes = str.as_bytes();
18
+
19
+
let mut hash = FNV_OFFSET_BASIS_32;
20
+
let mut i = 0;
21
+
let len = bytes.len();
22
+
23
+
while i < len {
24
+
hash = hash.wrapping_mul(FNV_PRIME_32);
25
+
hash ^= bytes[i] as u32;
26
+
i += 1;
27
+
}
28
+
29
+
hash
30
+
}
31
+
32
+
#[cfg(test)]
33
+
mod tests {
34
+
use super::*;
35
+
36
+
#[test]
37
+
fn it_works() {
38
+
let result = fnv32_hash("water_pump_1");
39
+
assert_eq!(result, 3557162331);
40
+
let result = fnv32_hash("pump_1_duration");
41
+
assert_eq!(result, 931766070);
42
+
}
43
+
}