use std::fmt; use std::num::ParseIntError; use std::ops::Deref; use serde::de::Visitor; use serde::{Deserialize, Serialize}; use serde::{Deserializer, Serializer}; mod dictionary; // Currently unused // mod murmurhash32; mod murmurhash64; pub const SEED: u32 = 0; pub use dictionary::Dictionary; pub use dictionary::HashGroup; pub use murmurhash64::hash; pub use murmurhash64::hash32; pub use murmurhash64::hash_inverse as inverse; fn _swap_bytes_u32(value: u32) -> u32 { u32::from_le_bytes(value.to_be_bytes()) } fn _swap_bytes_u64(value: u64) -> u64 { u64::from_le_bytes(value.to_be_bytes()) } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Murmur64(u64); #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Murmur32(u32); impl Deref for Murmur64 { type Target = u64; fn deref(&self) -> &Self::Target { &self.0 } } impl From for Murmur64 { fn from(value: u64) -> Self { Self(value) } } impl TryFrom<&str> for Murmur64 { type Error = ParseIntError; fn try_from(value: &str) -> Result { u64::from_str_radix(value, 16).map(Self) } } impl fmt::UpperHex for Murmur64 { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) } } impl fmt::Display for Murmur64 { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) } } impl<'de> Visitor<'de> for Murmur64 { type Value = Self; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str( "an usigned 64 bit integer \ or a string in hexadecimal format encoding such an integer", ) } fn visit_f64(self, value: f64) -> Result where E: serde::de::Error, { let bytes = value.to_le_bytes(); Ok(Self::from(u64::from_le_bytes(bytes))) } fn visit_u64(self, value: u64) -> Result where E: serde::de::Error, { Ok(Self::from(value)) } fn visit_str(self, value: &str) -> Result where E: serde::de::Error, { match Murmur64::try_from(value) { Ok(hash) => Ok(hash), Err(err) => Err(E::custom(format!( "failed to convert '{}' to Murmur64: {}", value, err ))), } } } impl<'de> Deserialize<'de> for Murmur64 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_any(Self(0)) } } impl Serialize for Murmur64 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&format!("{:016X}", self)) } } impl From for Murmur32 { fn from(value: u32) -> Self { Self(value) } } impl TryFrom<&str> for Murmur32 { type Error = ParseIntError; fn try_from(value: &str) -> Result { u32::from_str_radix(value, 16).map(Self) } } impl fmt::UpperHex for Murmur32 { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) } } impl fmt::Display for Murmur32 { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) } } impl Serialize for Murmur32 { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&format!("{:08X}", self)) } } impl<'de> Visitor<'de> for Murmur32 { type Value = Self; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str( "an usigned 32 bit integer \ or a string in hexadecimal format encoding such an integer", ) } fn visit_f64(self, value: f64) -> Result where E: serde::de::Error, { let bytes = value.to_le_bytes(); self.visit_u32(u64::from_le_bytes(bytes) as u32) } fn visit_u64(self, value: u64) -> Result where E: serde::de::Error, { self.visit_u32(value as u32) } fn visit_u32(self, value: u32) -> Result where E: serde::de::Error, { Ok(Self::from(value)) } fn visit_str(self, value: &str) -> Result where E: serde::de::Error, { match Murmur32::try_from(value) { Ok(hash) => Ok(hash), Err(err) => Err(E::custom(format!( "failed to convert '{}' to Murmur32: {}", value, err ))), } } } impl<'de> Deserialize<'de> for Murmur32 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_any(Self(0)) } }