feat: Implement murmur hash command

This commit is contained in:
Lucas Schwiderski 2022-12-10 19:28:49 +01:00
parent a4c6ba731a
commit 764d9c00f2
Signed by: lucas
GPG key ID: AA12679AAA6DF4D8
2 changed files with 42 additions and 8 deletions

View file

@ -2,6 +2,7 @@ use std::sync::Arc;
use clap::{Arg, ArgAction, ArgMatches, Command};
use color_eyre::eyre::Result;
use sdk::murmur::{Murmur32, Murmur64};
use tokio::sync::RwLock;
pub(crate) fn command_definition() -> Command {
@ -24,13 +25,28 @@ pub(crate) fn command_definition() -> Command {
),
),
)
.subcommand(
Command::new("lookup")
.arg(Arg::new("hash").required(true).help("The hash to look up.")),
)
}
#[tracing::instrument(skip_all)]
pub(crate) async fn run(_ctx: Arc<RwLock<sdk::Context>>, _matches: &ArgMatches) -> Result<()> {
unimplemented!()
pub(crate) async fn run(_ctx: Arc<RwLock<sdk::Context>>, matches: &ArgMatches) -> Result<()> {
match matches.subcommand() {
Some(("hash", sub_matches)) => {
let s = sub_matches
.get_one::<String>("string")
.expect("missing required argument");
if sub_matches.get_flag("half") {
let hash = Murmur32::hash(&s);
println!("{hash:08X}");
} else {
let hash = Murmur64::hash(&s);
println!("{hash:016X}");
}
Ok(())
}
_ => unreachable!(
"clap is configured to require a subcommand, and they're all handled above"
),
}
}

View file

@ -30,8 +30,14 @@ fn _swap_bytes_u64(value: u64) -> u64 {
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub struct Murmur64(u64);
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub struct Murmur32(u32);
impl Murmur64 {
pub fn hash<B>(s: B) -> Self
where
B: AsRef<[u8]>,
{
hash(s.as_ref(), SEED as u64).into()
}
}
impl Deref for Murmur64 {
type Target = u64;
@ -123,6 +129,18 @@ impl Serialize for Murmur64 {
}
}
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub struct Murmur32(u32);
impl Murmur32 {
pub fn hash<B>(s: B) -> Self
where
B: AsRef<[u8]>,
{
hash32(s.as_ref(), SEED).into()
}
}
impl From<u32> for Murmur32 {
fn from(value: u32) -> Self {
Self(value)