1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//! Module for implementations using [blake2](https://docs.rs/blake2).
use blake2::{VarBlake2b, digest::{Update, VariableOutput}};
use generic_array::{ArrayLength, GenericArray};

/// An implementation of [Mapper](trait.Mapper.html) using
/// [blake2](https://docs.rs/blake2).
pub struct Mapper;

impl crate::Mapper for Mapper {
    fn map<N>(x: &[u8]) -> GenericArray<u8, N>
    where N: ArrayLength<u8> {
        let mut hasher = VarBlake2b::new(N::to_usize()).unwrap();
        hasher.update(x);
        let mut array = None;
        hasher.finalize_variable(|digest| {
            array = Some(GenericArray::<u8, N>::clone_from_slice(digest));
        });
        array.unwrap()
    }
}