Reimplement PartialEq, Eq and Hash for Member

This commit is contained in:
NicolasCantu 2025-01-02 13:27:29 +01:00 committed by Nicolas Cantu
parent 129f957214
commit 6365c2ccdd

View File

@ -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<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 {
pub fn new(sp_addresses: Vec<SilentPaymentAddress>) -> Result<Self> {
if sp_addresses.is_empty() {