如何使用从 sha2 板条箱实现 Digest 特征的类型(例如 Sha256)对结构进行散列?

Mar*_*ouw 3 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());
Run Code Online (Sandbox Code Playgroud)

我的拉伸目标是简单地使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Isa*_*kel 6

您不能为外部类型实现外部特征

你的问题是digest类型,比如Sha256,没有实现Hasher- 因为它们是不同种类的哈希。该Hasher特征适用于将数据散列为 64 位散列值的类型,用于 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()
    }
}
Run Code Online (Sandbox Code Playgroud)