Documentation
use std::num::ParseIntError;


pub fn get_hash_from_str(hash_str: &str) -> Result<u64, ParseIntError> {
    let mut str = hash_str;
    if hash_str.contains(":") {
        str = &hash_str[2..hash_str.len()];
    }
    let from_str_radix = u64::from_str_radix(str, 16);
    println!("{:?}", from_str_radix);
    from_str_radix
}

fn popcnt(mut x: u64) -> u64 {
    let mut diff = 0;
    while x != 0 {
        diff += x & 1;
        x >>= 1;
    }
    diff
}

pub fn distance_from_str(lstr: &str, rstr: &str) -> u64 {
    let l = get_hash_from_str(lstr);
    let r = get_hash_from_str(rstr);
    distance(l.unwrap(), r.unwrap())
}

fn distance(l: u64, r: u64) -> u64 {
    let hamming = l ^ r;
    popcnt(hamming)
}