如何使用从sha2板条箱实现Digest特性的类型(例如Sha256)对结构进行哈希处理?

时间:2019-05-18 07:56:13

标签: hash rust

我正在尝试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(),该哈希将散列该结构上的所有属性。这是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)
    }
}

1 个答案:

答案 0 :(得分:3)

You can't implement an external trait for an external type

您的问题是digest类型(例如Sha256)没有实现Hasher-因为它们是不同种类的哈希。 Hasher特性适用于哈希数据为into a 64 bit hash value的类型,供Rust自己的代码使用,例如HashMap。另一方面,Sha256给出的哈希值为 32字节

要使用Sha256,您需要将要计算其哈希值的字节手动提供给它-您可以在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()
    }
}