Skip to content

Commit 089c37e

Browse files
committed
feat: add a way to return hashing implementations
It's now possible to get a hasher implementation based on a `Code` This commits allso adds some tests for the `Code` enum.
1 parent 9d46740 commit 089c37e

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

src/hashes.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use sha1::Sha1 as Sha1Hasher;
55
use sha2::{Sha256, Sha512};
66
use tiny_keccak::{Hasher, Keccak, Sha3};
77

8-
use crate::digests::{wrap, Multihash, MultihashDigest};
8+
use crate::digests::{wrap, DynMultihashDigest, Multihash, MultihashDigest};
99

1010
#[derive(Clone, Debug, PartialEq)]
1111
pub enum Code {
@@ -84,6 +84,40 @@ impl Code {
8484
_ => Code::Custom(code),
8585
}
8686
}
87+
88+
/// Return the hasher that is used to create a hash with this code.
89+
///
90+
/// If a custom code is used, `None` is returned.
91+
pub fn hasher(&self) -> Option<Box<dyn DynMultihashDigest>> {
92+
match *self {
93+
Self::Custom(_) => None,
94+
Self::Implemented(code) => Some(code.hasher()),
95+
}
96+
}
97+
}
98+
99+
impl ImplementedCode {
100+
/// Return the Multihash implementation that does the actual hashing
101+
fn hasher(self) -> Box<dyn DynMultihashDigest> {
102+
match self {
103+
ImplementedCode::Identity => Box::new(Identity),
104+
ImplementedCode::Sha1 => Box::new(Sha1),
105+
ImplementedCode::Sha2_256 => Box::new(Sha2_256),
106+
ImplementedCode::Sha2_512 => Box::new(Sha2_512),
107+
ImplementedCode::Sha3_224 => Box::new(Sha3_224),
108+
ImplementedCode::Sha3_256 => Box::new(Sha3_256),
109+
ImplementedCode::Sha3_384 => Box::new(Sha3_384),
110+
ImplementedCode::Sha3_512 => Box::new(Sha3_512),
111+
ImplementedCode::Keccak224 => Box::new(Keccak224),
112+
ImplementedCode::Keccak256 => Box::new(Keccak256),
113+
ImplementedCode::Keccak384 => Box::new(Keccak384),
114+
ImplementedCode::Keccak512 => Box::new(Keccak512),
115+
ImplementedCode::Blake2b256 => Box::new(Blake2b256),
116+
ImplementedCode::Blake2b512 => Box::new(Blake2b512),
117+
ImplementedCode::Blake2s128 => Box::new(Blake2s128),
118+
ImplementedCode::Blake2s256 => Box::new(Blake2s256),
119+
}
120+
}
87121
}
88122

89123
#[derive(Clone, Debug)]

tests/hashes.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use multihash::{wrap, Code, ImplementedCode, Multihash, MultihashDigest, Sha3_512};
2+
3+
#[test]
4+
fn to_u64() {
5+
assert_eq!(Code::Implemented(ImplementedCode::Keccak256).to_u64(), 0x1b);
6+
assert_eq!(Code::Custom(0x1234).to_u64(), 0x1234);
7+
}
8+
9+
#[test]
10+
fn from_u64() {
11+
assert_eq!(
12+
Code::from_u64(0xb220),
13+
Code::Implemented(ImplementedCode::Blake2b256)
14+
);
15+
assert_eq!(Code::from_u64(0x0011_2233), Code::Custom(0x0011_2233));
16+
}
17+
18+
#[test]
19+
fn hasher() {
20+
let expected = Sha3_512::digest(b"abcdefg");
21+
let hasher = Code::Implemented(ImplementedCode::Sha3_512)
22+
.hasher()
23+
.unwrap();
24+
assert_eq!(hasher.digest(b"abcdefg"), expected);
25+
assert!(Code::Custom(0x2222).hasher().is_none());
26+
}
27+
28+
#[test]
29+
fn custom_multihash_digest() {
30+
#[derive(Clone, Debug)]
31+
struct SameHash;
32+
impl MultihashDigest for SameHash {
33+
const CODE: Code = Code::Custom(0x9999);
34+
35+
fn digest(_data: &[u8]) -> Multihash {
36+
let data = b"alwaysthesame";
37+
wrap(&Self::CODE, data)
38+
}
39+
}
40+
41+
let my_hash = SameHash::digest(b"abc");
42+
assert_eq!(my_hash.digest(), b"alwaysthesame");
43+
}

0 commit comments

Comments
 (0)