diff --git a/crates/libs/core/src/strings/hstring.rs b/crates/libs/core/src/strings/hstring.rs index 11f93c2fdb..b8acf67a47 100644 --- a/crates/libs/core/src/strings/hstring.rs +++ b/crates/libs/core/src/strings/hstring.rs @@ -191,6 +191,12 @@ impl Ord for HSTRING { } } +impl std::hash::Hash for HSTRING { + fn hash<H: std::hash::Hasher>(&self, hasher: &mut H) { + self.as_wide().hash(hasher) + } +} + impl PartialOrd for HSTRING { fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { Some(self.cmp(other)) diff --git a/crates/tests/core/tests/hstring.rs b/crates/tests/core/tests/hstring.rs index 9b38bff9dd..8016cbf3e0 100644 --- a/crates/tests/core/tests/hstring.rs +++ b/crates/tests/core/tests/hstring.rs @@ -121,6 +121,50 @@ fn hstring_to_os_string() { assert_eq!(s, std::ffi::OsString::from_wide(wide_data)); } +#[test] +fn hstring_hashing_equal_strings() { + // Checks if two strings of identical contents have the same hash + use std::hash::{DefaultHasher, Hash, Hasher}; + + let hstring_1 = HSTRING::from("Hello World"); + let hstring_2 = HSTRING::from("Hello World"); + + assert_eq!(hstring_1, hstring_2); + + let mut hasher_1 = DefaultHasher::new(); + let mut hasher_2 = DefaultHasher::new(); + + hstring_1.hash(&mut hasher_1); + hstring_2.hash(&mut hasher_2); + + let h1_hash = hasher_1.finish(); + let h2_hash = hasher_2.finish(); + + assert_eq!(h1_hash, h2_hash); +} + +#[test] +fn hstring_hashing_different_strings() { + // Checks if two strings of different contents have the same hash + use std::hash::{DefaultHasher, Hash, Hasher}; + + let hstring_1 = HSTRING::from("Hello World"); + let hstring_2 = HSTRING::from("Hello World 2"); + + assert_ne!(hstring_1, hstring_2); + + let mut hasher_1 = DefaultHasher::new(); + let mut hasher_2 = DefaultHasher::new(); + + hstring_1.hash(&mut hasher_1); + hstring_2.hash(&mut hasher_2); + + let h1_hash = hasher_1.finish(); + let h2_hash = hasher_2.finish(); + + assert_ne!(h1_hash, h2_hash); +} + #[test] fn hstring_equality_combinations() { let h = HSTRING::from("test");