Reimplement PartialEq, Eq and Hash for Member
This commit is contained in:
parent
b6ffebf6c0
commit
57ce288ca4
25
src/pcd.rs
25
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<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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user