我如何使用从SHA2板条箱(例如SHA256)实现摘要性状的类型来哈希



我正在尝试基于其内容来为该结构生成guid。

use sha2::{Digest, Sha256};
use std::hash::{Hash, Hasher};
#[derive(Hash)]
struct Person {
  firstName: String;
  lastName: String;
}
let a = Person {
   firstName: "bob".to_string(),
   lastName: "the builder".to_string()
}
let mut s = Sha256::new();
a.hash(&mut s);
println!("{}", s.finsih());

我的延长目标是简单地使用a.id(),该CC_2可以放置该结构上的所有属性。这是impl Person { id() -> String }吗?

我尝试使用impl x for y,但这扔了impl doesn't use types inside crate

impl Hasher for Sha256 {
    fn finish(&self) -> u64 {
        self.0.result()
    }
    fn write(&mut self, msg: &[u8]) {
        self.0.input(msg)
    }
}

您无法实现外部类型的外部特征。

您的问题是digest类型(例如Sha256(不要实现Hasher - 因为它们是不同种类的哈希。Hasher特征是用于将数据分为64位哈希值的类型,用于Rust自己的代码,例如Sha2560。另一方面,Sha256给出了 32个字节的哈希。

要使用Sha256,您需要手动将其馈送为要计算的hash的字节 - 您可以在impl块中执行此操作。

impl Person {
    fn id(&self) -> sha2::digest::generic_array::GenericArray<u8, <Sha256 as Digest>::OutputSize> {
        let mut s = Sha256::new();
        s.input(self.firstName.as_bytes());
        s.input(self.lastName.as_bytes());
        s.result()
    }
}

最新更新