objecthash 0.4.1

A content hashing algorithm which works across multiple encodings (JSON, Protobufs, etc)
Documentation
#[macro_export]
macro_rules! objecthash_member {
    ($key:expr => $value:expr) => {
        {
            let key_digest = $crate::digest($key);
            let value_digest = $crate::digest($value);
            let mut result = Vec::with_capacity(key_digest.as_ref().len() + value_digest.as_ref().len());

            result.extend_from_slice(key_digest.as_ref());
            result.extend_from_slice(value_digest.as_ref());
            result
        }
    }
}

#[macro_export]
macro_rules! objecthash_struct(
    { $hasher:expr, $($key:expr => $value:expr),+ } => {
        {
            let mut digests: Vec<Vec<u8>> = Vec::new();

            $(
                digests.push(objecthash_member!($key => $value));
            )+

            digests.sort();

            $hasher.update($crate::types::DICT_TAG);
            for value in &digests {
                $hasher.update(&value);
            }
        }
     };
);

#[cfg(test)]
#[cfg(feature = "objecthash-ring")]
mod tests {
    use {hasher, ObjectHasher};
    use rustc_serialize::hex::ToHex;

    #[test]
    fn objecthash_struct_test() {
        let mut h = hasher::default();

        objecthash_struct!(h, "foo" => &1);

        assert_eq!(
            h.finish().as_ref().to_hex(),
            "bf4c58f5e308e31e2cd64bdbf7a01b9b595a13602438be5e912c7d94f6d8177a"
        );
    }
}