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