Как мне хэшировать структуру, используя тип, который реализует черту Digest из ящика sha2, такую ​​как Sha256? - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь 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 Ответ

3 голосов
/ 18 мая 2019

Невозможно реализовать внешнюю черту для внешнего типа .

Ваша проблема в том, что типы 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()
    }
}
...