diff --git a/src/hash/blake/mod.rs b/src/hash/blake/mod.rs index c1ea386..488c8ba 100644 --- a/src/hash/blake/mod.rs +++ b/src/hash/blake/mod.rs @@ -1,11 +1,12 @@ 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, slice::from_raw_parts, }; -use winter_utils::collections::Vec; #[cfg(test)] mod tests; @@ -277,21 +278,15 @@ where let digest = if Felt::IS_CANONICAL { blake3::hash(E::elements_as_bytes(elements)) } else { - let blen = elements.len() << 3; - - let mut bytes = Vec::with_capacity(blen); - #[allow(clippy::uninit_vec)] - unsafe { - bytes.set_len(blen) - } + let base_elements = E::as_base_elements(elements); + let blen = base_elements.len() << 3; - for (idx, element) in E::as_base_elements(elements).iter().enumerate() { + 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()); } - let mut hasher = blake3::Hasher::new(); - hasher.update(&bytes); - hasher.finalize() + blake3::hash(&bytes) }; *shrink_bytes(&digest.into()) }