Skip to main content

frozen_collections_core/hashers/
length_hasher.rs

1use crate::traits::{Hasher, Len};
2
3/// Returns the value's length as the hash.
4///
5#[doc = include_str!("../doc_snippets/private_api_warning.md")]
6#[derive(Clone, Debug, Default)]
7pub struct LengthHasher;
8
9impl<T> Hasher<T> for LengthHasher
10where
11    T: ?Sized + Len,
12{
13    #[inline]
14    fn hash_one(&self, value: &T) -> u64 {
15        value.len() as u64
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use alloc::vec;
23
24    #[test]
25    fn hash_string_returns_length() {
26        let hasher = LengthHasher {};
27        let value = String::from("hello");
28        assert_eq!(hasher.hash_one(&value), 5);
29    }
30
31    #[test]
32    fn hash_str_returns_length() {
33        let hasher = LengthHasher {};
34        let value = "world";
35        assert_eq!(hasher.hash_one(value), 5);
36    }
37
38    #[test]
39    fn hash_slice_returns_length() {
40        let hasher = LengthHasher {};
41        let binding = vec![1, 2, 3, 4];
42        let value = binding.as_slice();
43        assert_eq!(hasher.hash_one(value), 4);
44    }
45
46    #[test]
47    fn default_creates_instance() {
48        #[expect(clippy::default_constructed_unit_structs, reason = "Testing Default trait")]
49        let hasher = LengthHasher::default();
50
51        assert_eq!(hasher.hash_one(&"default"), 7);
52    }
53}