]> code.octet-stream.net Git - hashgood/blobdiff - src/calculate.rs
Build scripts
[hashgood] / src / calculate.rs
index 5928c52fa30bf2dda063c26866dedd4af783504b..955016dae59fe6139f97553cb9e7cef071dae415 100644 (file)
@@ -2,6 +2,7 @@ use super::Algorithm;
 use md5::{Digest, Md5};
 use sha1::Sha1;
 use sha2::Sha256;
+use sha2::Sha512;
 use std::error::Error;
 use std::fs::File;
 use std::io::prelude::*;
@@ -57,6 +58,11 @@ pub fn create_digests(algorithms: &[Algorithm], mut input: Box<dyn Read>) -> Cal
         senders.push(s);
         handles.push(sha256_digest(r));
     }
+    if algorithms.contains(&Algorithm::Sha512) {
+        let (s, r) = channel();
+        senders.push(s);
+        handles.push(sha512_digest(r));
+    }
 
     // 64 KB chunks will be read from the input at 64 KB and supplied to all hashing threads at once
     // Right now that could be up to three threads. If CPU-bound, the other threads will mostly block while the slowest one finishes
@@ -115,6 +121,18 @@ fn sha256_digest(rx: Receiver<Arc<Vec<u8>>>) -> JoinHandle<(Algorithm, Vec<u8>)>
     })
 }
 
+/// Calculate the sha512 digest of some data on the given channel
+fn sha512_digest(rx: Receiver<Arc<Vec<u8>>>) -> JoinHandle<(Algorithm, Vec<u8>)> {
+    thread::spawn(move || {
+        let mut sha512 = Sha512::new();
+        while let Ok(chunk) = rx.recv() {
+            sha512.update(&*chunk);
+        }
+        let result = sha512.finalize();
+        (Algorithm::Sha512, result.to_vec())
+    })
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
@@ -139,7 +157,7 @@ mod tests {
         "b9193853f7798e92e2f6b82eda336fa7d6fc0fa90fdefe665f372b0bad8cdf8c";
 
     fn verify_digest(alg: Algorithm, data: &'static [u8], hash: &str) {
-        let reader = Cursor::new(&*data);
+        let reader = Cursor::new(data);
         let digests = create_digests(&[alg], Box::new(reader)).unwrap();
         assert_eq!(digests.len(), 1);
         assert_eq!(digests[0], (alg, hex::decode(hash).unwrap()));