frozen_collections_core/hashers/
length_hasher.rs1use crate::traits::{Hasher, Len};
2
3#[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}