1mod belt;
6mod blake2;
7mod blake3;
8mod sha256;
9mod sha3;
10mod streebog;
11
12pub use belt::BeltHashHasher;
13pub use blake2::{Blake2b512Hasher, Blake2s256Hasher};
14pub use blake3::Blake3Hasher;
15pub use sha3::{Sha3_256Hasher, Sha3_512Hasher};
16pub use sha256::Sha256Hasher;
17pub use streebog::{Streebog256Hasher, Streebog512Hasher};
18
19use sha2::Digest;
20
21use crate::contract::{Hasher, Identified};
22use crate::error::Result;
23
24pub trait NamedDigest {
32 type Core: Digest;
34}
35
36impl<D: NamedDigest + Identified + Send + Sync> Hasher for D {
37 fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
38 Ok(D::Core::digest(data).to_vec())
39 }
40}
41
42macro_rules! hasher {
46 ($name:ident, $identifier:literal, $doc:literal $(,)?) => {
47 #[doc = $doc]
48 #[derive(Debug, Default, Clone, Copy)]
49 pub struct $name;
50
51 impl $name {
52 pub const IDENTIFIER: &'static str = $identifier;
53
54 pub fn new() -> Self {
55 Self
56 }
57 }
58
59 impl $crate::contract::Identified for $name {
60 fn identifier(&self) -> &str {
61 Self::IDENTIFIER
62 }
63 }
64 };
65}
66
67pub(crate) use hasher;