tangle_indexer


git clone https://radroots.dev/git/tangle_indexer.git
Log | Files | Refs | Submodules | LICENSE

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 }