arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
Merge pull request #29 from 0xPolygonMiden/itzmeanjan-blake3-improv

Optimize BLAKE3 Sequential Hashing
Anjan Roy 45074836+itzmeanjan@users.noreply.github.com
Mon, 12 Dec 2022 10:51:36 +0400
commit

1332299a82af642fad899719a5475572b15b82d7

parent

9782992662c1c01e89d0c55de220a1235877abdc

1 files changed, 11 insertions(+), 5 deletions(-)

jump to
M src/hash/blake/mod.rs → src/hash/blake/mod.rs

@@ -1,5 +1,7 @@

use super::{Digest, ElementHasher, Felt, FieldElement, Hasher, StarkField}; -use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; +use crate::utils::{ + uninit_vector, ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, +}; use core::{ mem::{size_of, transmute, transmute_copy}, ops::Deref,

@@ -276,11 +278,15 @@ // this is a compile-time branch so it is for free

let digest = if Felt::IS_CANONICAL { blake3::hash(E::elements_as_bytes(elements)) } else { - let mut hasher = blake3::Hasher::new(); - for element in E::as_base_elements(elements) { - hasher.update(&element.as_int().to_le_bytes()); + let base_elements = E::as_base_elements(elements); + let blen = base_elements.len() << 3; + + let mut bytes = unsafe { uninit_vector(blen) }; + for (idx, element) in base_elements.iter().enumerate() { + bytes[idx * 8..(idx + 1) * 8].copy_from_slice(&element.as_int().to_le_bytes()); } - hasher.finalize() + + blake3::hash(&bytes) }; *shrink_bytes(&digest.into()) }