Reimplement PartialEq, Eq and Hash for Member

This commit is contained in:
NicolasCantu 2025-01-02 13:27:29 +01:00
parent b6ffebf6c0
commit 57ce288ca4

View File

@ -1,6 +1,7 @@
use anyhow::{Error, Result}; use anyhow::{Error, Result};
use rs_merkle::{algorithms::Sha256, MerkleTree}; use rs_merkle::{algorithms::Sha256, MerkleTree};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::hash::{Hash as StdHash, Hasher};
use aes_gcm::{ use aes_gcm::{
aead::{Aead, Payload}, aead::{Aead, Payload},
@ -22,12 +23,34 @@ use crate::{
signature::{AnkHash, AnkValidationNoHash, AnkValidationYesHash, Proof}, 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)] #[tsify(into_wasm_abi, from_wasm_abi)]
pub struct Member { pub struct Member {
sp_addresses: Vec<String>, sp_addresses: Vec<String>,
} }
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<H: Hasher>(&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 { impl Member {
pub fn new(sp_addresses: Vec<SilentPaymentAddress>) -> Result<Self> { pub fn new(sp_addresses: Vec<SilentPaymentAddress>) -> Result<Self> {
if sp_addresses.is_empty() { if sp_addresses.is_empty() {