use crate::node_encoder::NodeEncoder;
use crate::stable_hasher::StableHasher;
use std::fmt;
use crate::node::NormalizedNode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Fingerprint(u64);
impl Fingerprint {
#[must_use]
pub const fn new(value: u64) -> Self {
Self(value)
}
#[must_use]
pub fn from_node(node: &NormalizedNode) -> Self {
let mut encoder = NodeEncoder::new();
encoder.encode(node);
Self(encoder.finish())
}
#[must_use]
pub fn from_sig_and_body(sig: &NormalizedNode, body: &NormalizedNode) -> Self {
let mut encoder = NodeEncoder::new();
encoder.encode(sig);
encoder.encode(body);
Self(encoder.finish())
}
#[must_use]
pub fn from_fingerprints(fps: &[Self]) -> Self {
let mut sorted: Vec<u64> = fps.iter().map(|fp| fp.0).collect();
sorted.sort_unstable();
let mut hasher = StableHasher::new();
for value in &sorted {
hasher.write_u64(*value);
}
Self(hasher.finish())
}
#[must_use]
pub const fn value(self) -> u64 {
self.0
}
#[must_use]
pub fn to_hex(self) -> String {
format!("{:016x}", self.0)
}
pub fn from_hex(s: &str) -> Option<Self> {
u64::from_str_radix(s, 16).ok().map(Fingerprint)
}
}
impl fmt::Display for Fingerprint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:016x}", self.0)
}
}