use blake2b_simd::Params;
use sha2::{Digest, Sha256};
pub type Hash32 = [u8; 32];
pub fn blake2b_256_personal(personal: &[u8], data: &[u8]) -> Hash32 {
let mut out = [0u8; 32];
let hash = Params::new()
.hash_length(32)
.personal(personal)
.to_state()
.update(data)
.finalize();
out.copy_from_slice(hash.as_bytes());
out
}
pub fn blake2b_256(data: &[u8]) -> Hash32 {
blake2b_256_personal(b"BlklHash", data)
}
pub fn blake2b_256_raw(data: &[u8]) -> Hash32 {
let mut out = [0u8; 32];
let hash = Params::new().hash_length(32).to_state().update(data).finalize();
out.copy_from_slice(hash.as_bytes());
out
}
pub fn sha256d(data: &[u8]) -> Hash32 {
let first = Sha256::digest(data);
let second = Sha256::digest(first);
let mut out = [0u8; 32];
out.copy_from_slice(&second);
out
}
pub fn address_hash(pubkey: &[u8]) -> [u8; 32] {
blake2b_256_personal(b"BlklAddr", pubkey)
}
pub fn display_hash(h: &Hash32) -> String {
let mut rev = *h;
rev.reverse();
hex::encode(rev)
}