From 57ce288ca4393b521dd2bc23b4449556b38c6fad Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Thu, 2 Jan 2025 13:27:29 +0100 Subject: [PATCH] Reimplement PartialEq, Eq and Hash for Member --- src/pcd.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/pcd.rs b/src/pcd.rs index b6cbef0..80067ab 100644 --- a/src/pcd.rs +++ b/src/pcd.rs @@ -1,6 +1,7 @@ use anyhow::{Error, Result}; use rs_merkle::{algorithms::Sha256, MerkleTree}; use std::collections::{HashMap, HashSet}; +use std::hash::{Hash as StdHash, Hasher}; use aes_gcm::{ aead::{Aead, Payload}, @@ -22,12 +23,34 @@ use crate::{ signature::{AnkHash, AnkValidationNoHash, AnkValidationYesHash, Proof}, }; -#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Tsify)] +#[derive(Debug, Default, Clone, Serialize, Deserialize, Tsify)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct Member { sp_addresses: Vec, } +impl PartialEq for Member { + fn eq(&self, other: &Self) -> bool { + let self_set: HashSet<_> = self.sp_addresses.iter().collect(); + let other_set: HashSet<_> = other.sp_addresses.iter().collect(); + self_set == other_set + } +} + +impl Eq for Member {} + +impl StdHash for Member { + fn hash(&self, state: &mut H) { + // Convert to a set to ensure order independence + let set: HashSet<_> = self.sp_addresses.iter().collect(); + let mut unique_items: Vec<_> = set.into_iter().collect(); + unique_items.sort_unstable(); // Sort to ensure consistent hashing + for item in unique_items { + item.hash(state); + } + } +} + impl Member { pub fn new(sp_addresses: Vec) -> Result { if sp_addresses.is_empty() {