crypto.rs (1149B)
1 use serde::Serialize; 2 use sha2::{Digest, Sha256}; 3 use std::io::{Read, Result as IoResult}; 4 5 pub fn sha256_hex(data: &[u8]) -> String { 6 let mut hasher = Sha256::new(); 7 hasher.update(data); 8 format!("{:x}", hasher.finalize()) 9 } 10 11 pub fn compute_hash_of_reader<R: Read>(mut reader: R) -> IoResult<String> { 12 let mut hasher = Sha256::new(); 13 let mut buf = [0u8; 8192]; 14 loop { 15 let n = reader.read(&mut buf)?; 16 if n == 0 { 17 break; 18 } 19 hasher.update(&buf[..n]); 20 } 21 Ok(format!("{:x}", hasher.finalize())) 22 } 23 24 pub fn compute_hash<T: Serialize>(value: &T) -> anyhow::Result<String> { 25 struct HasherWriter<'a>(&'a mut Sha256); 26 impl<'a> std::io::Write for HasherWriter<'a> { 27 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 28 self.0.update(buf); 29 Ok(buf.len()) 30 } 31 fn flush(&mut self) -> std::io::Result<()> { 32 Ok(()) 33 } 34 } 35 36 let mut hasher = Sha256::new(); 37 { 38 let writer = HasherWriter(&mut hasher); 39 serde_json::to_writer(writer, value)?; 40 } 41 Ok(format!("{:x}", hasher.finalize())) 42 }