Skip to main content

encryption/hash/
sha256.rs

1// Copyright (c) 2026 erik <erik@erik.xyz> — https://erik.xyz
2
3//! SHA-256 哈希;输出 32 字节。
4
5use sha2::{Digest, Sha256};
6
7use crate::contract::{Hasher, Identified};
8use crate::error::Result;
9
10/// SHA-256 哈希器(无状态,可复用)。
11#[derive(Debug, Default, Clone, Copy)]
12pub struct Sha256Hasher;
13
14impl Sha256Hasher {
15    pub const IDENTIFIER: &'static str = "sha256";
16
17    pub fn new() -> Self {
18        Self
19    }
20}
21
22impl Identified for Sha256Hasher {
23    fn identifier(&self) -> &str {
24        Self::IDENTIFIER
25    }
26}
27
28impl Hasher for Sha256Hasher {
29    fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
30        Ok(Sha256::digest(data).to_vec())
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn matches_known_vector() {
40        let hasher = Sha256Hasher::new();
41        assert_eq!(
42            hasher.digest_hex(b"abc").unwrap(),
43            "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
44        );
45        assert_eq!(hasher.digest(b"abc").unwrap().len(), 32);
46    }
47}