use super::{Hash, bkdr::Bkdr, crc32::Crc32};
#[derive(Debug, Clone)]
pub struct BkdrAbsCrc32 {
bkdr: Bkdr,
crc32: Crc32,
}
impl Default for BkdrAbsCrc32 {
fn default() -> Self {
Self {
bkdr: Default::default(),
crc32: Default::default(),
}
}
}
impl Hash for BkdrAbsCrc32 {
fn hash<S: super::HashKey>(&self, key: &S) -> i64 {
let mut hash_key = String::with_capacity(key.len());
for i in 0..key.len() {
let c = key.at(i);
if c.is_ascii_digit() {
hash_key.push(c as char);
} else {
break;
}
}
if hash_key.len() == 0 {
tracing::warn!("found malformed bkdrabscrc32 key:{:?}", key);
return 0;
}
let hash = self.bkdr.hash(&hash_key.as_bytes());
let hash_abs = hash.abs().to_string();
self.crc32.hash(&hash_abs.as_bytes())
}
}