From d99f1511ebded582dd440dcbbf2c19b8d7236f1d Mon Sep 17 00:00:00 2001 From: Intege-rs Date: Tue, 3 Feb 2026 03:39:43 -0500 Subject: [PATCH] fix enum discriminants not being included in the hash --- hash2_derive/src/lib.rs | 8 +++++++- tests/derive_test.rs | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/hash2_derive/src/lib.rs b/hash2_derive/src/lib.rs index e1a6d8d..c5f1e52 100644 --- a/hash2_derive/src/lib.rs +++ b/hash2_derive/src/lib.rs @@ -35,6 +35,11 @@ pub fn derive_hash2(input: TokenStream) -> TokenStream { } } Data::Enum(data) => { + // Hash the discriminant first to ensure different variants hash differently + let discriminant_hash = quote! { + core::mem::discriminant(self).hash(state); + }; + let variants = data.variants.iter().map(|variant| { let variant_name = &variant.ident; match &variant.fields { @@ -69,8 +74,9 @@ pub fn derive_hash2(input: TokenStream) -> TokenStream { } } }); - + quote! { + #discriminant_hash match self { #(#variants)* } diff --git a/tests/derive_test.rs b/tests/derive_test.rs index 2675d4c..f7017ea 100644 --- a/tests/derive_test.rs +++ b/tests/derive_test.rs @@ -1,3 +1,4 @@ +use std::hash::{Hash, Hasher}; use hash2::Hash2; #[derive(Hash2)] @@ -49,6 +50,13 @@ where ref2: &'b str, } +#[derive(Hash2)] +enum ScalerEnum { + A, + B, + C, +} + #[derive(Hash2)] enum SimpleEnum { A, @@ -141,6 +149,21 @@ fn test_complex() { let _ = hash_value(&s); } +#[test] +fn test_scaler_enum() { + let e1 = ScalerEnum::A; + let e2 = ScalerEnum::B; + let e3 = ScalerEnum::C; + + let a = hash_value(&e1); + let b = hash_value(&e2); + let c = hash_value(&e3); + assert_ne!(a, b); + assert_ne!(a, c); + assert_ne!(b, c); +} + + #[test] fn test_simple_enum() { let e1 = SimpleEnum::A;