rdedup-lib 3.2.0

Data deduplication with compression and public key encryption. - library
Documentation
use std::sync::Arc;

use digest::Digest;

use crate::SGData;
use crate::DIGEST_SIZE;

pub type ArcHasher = Arc<dyn Hasher + Send + Sync>;

pub trait Hasher {
    fn calculate_digest(&self, sg: &SGData) -> Vec<u8>;
    fn calculate_digest_simple(&self, sg: &[u8]) -> Vec<u8>;
}

pub struct Sha256;

impl Hasher for Sha256 {
    fn calculate_digest(&self, sg: &SGData) -> Vec<u8> {
        let mut sha256 = sha2::Sha256::default();

        for sg_part in sg.as_parts() {
            sha256.update(sg_part);
        }

        let mut vec_result = vec![0u8; DIGEST_SIZE];
        vec_result.copy_from_slice(&sha256.finalize());

        vec_result
    }

    fn calculate_digest_simple(&self, data: &[u8]) -> Vec<u8> {
        let mut sha256 = sha2::Sha256::default();

        sha256.update(data);

        let mut vec_result = vec![0u8; DIGEST_SIZE];
        vec_result.copy_from_slice(&sha256.finalize());

        vec_result
    }
}

pub struct Blake2b;

impl Hasher for Blake2b {
    fn calculate_digest(&self, sg: &SGData) -> Vec<u8> {
        let mut blake2 = blake2::Blake2b::default();

        for sg_part in sg.as_parts() {
            blake2.update(sg_part);
        }

        let mut vec_result = vec![0u8; DIGEST_SIZE];
        vec_result.copy_from_slice(&blake2.finalize()[..DIGEST_SIZE]);

        vec_result
    }

    fn calculate_digest_simple(&self, data: &[u8]) -> Vec<u8> {
        let mut blake2 = blake2::Blake2b::default();

        blake2.update(data);

        let mut vec_result = vec![0u8; DIGEST_SIZE];
        vec_result.copy_from_slice(&blake2.finalize()[..DIGEST_SIZE]);

        vec_result
    }
}