encryption/hash/
blake3.rs1use crate::contract::Hasher;
10use crate::error::Result;
11use crate::hash::hasher;
12
13hasher!(Blake3Hasher, "blake3", "BLAKE3 哈希器(无状态,可复用)。");
14
15impl Hasher for Blake3Hasher {
16 fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
17 Ok(blake3::hash(data).as_bytes().to_vec())
18 }
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24
25 #[test]
30 fn matches_official_test_vectors() {
31 let hasher = Blake3Hasher::new();
32 assert_eq!(
33 hasher.digest_hex(b"").unwrap(),
34 "af1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262"
35 );
36 assert_eq!(
37 hasher.digest_hex(&[0x00]).unwrap(),
38 "2d3adedff11b61f14c886e35afa036736dcd87a74d27b5c1510225d0f592e213"
39 );
40 assert_eq!(hasher.digest(b"").unwrap().len(), 32);
41 }
42
43 #[test]
45 fn digest_hex_is_lowercase_hex() {
46 let hex = Blake3Hasher::new().digest_hex(b"abc").unwrap();
47 assert_eq!(hex.len(), 64);
48 assert!(
49 hex.bytes()
50 .all(|b| b.is_ascii_hexdigit() && !b.is_ascii_uppercase())
51 );
52 }
53
54 #[test]
56 fn distinct_inputs_distinct_digests() {
57 let hasher = Blake3Hasher::new();
58 assert_ne!(
59 hasher.digest(b"abc").unwrap(),
60 hasher.digest(b"abd").unwrap()
61 );
62 }
63}