From d594b8fc2d20c3969be64873a5f802191032c74f Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 17 Dec 2021 08:46:07 +0100 Subject: [PATCH 1/2] Convert chunks of 7 bytes instead of 8 --- src/hash/hash_types.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/hash/hash_types.rs b/src/hash/hash_types.rs index 19228b41..e645b5c3 100644 --- a/src/hash/hash_types.rs +++ b/src/hash/hash_types.rs @@ -3,8 +3,6 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::field::field_types::{Field, PrimeField, RichField}; use crate::iop::target::Target; -use crate::util::ceil_div_usize; -use crate::util::serialization::Buffer; /// Represents a ~256 bit hash output. #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] @@ -162,10 +160,13 @@ impl From> for u64 { impl From> for Vec { fn from(hash: BytesHash) -> Self { - let n = hash.0.len(); - let mut v = hash.0.to_vec(); - v.resize(ceil_div_usize(n, 8) * 8, 0); - let mut buffer = Buffer::new(v); - buffer.read_field_vec(buffer.len() / 8).unwrap() + hash.0 + .chunks(7) + .map(|bytes| { + let mut arr = [0; 8]; + arr[..bytes.len()].copy_from_slice(bytes); + F::from_canonical_u64(u64::from_le_bytes(arr)) + }) + .collect() } } From 0538511c9dcb00681f64028ab959d1ebee17da47 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Mon, 20 Dec 2021 09:22:23 +0100 Subject: [PATCH 2/2] Comment for why 7 bytes --- src/hash/hash_types.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hash/hash_types.rs b/src/hash/hash_types.rs index e645b5c3..79ca3950 100644 --- a/src/hash/hash_types.rs +++ b/src/hash/hash_types.rs @@ -161,6 +161,7 @@ impl From> for u64 { impl From> for Vec { fn from(hash: BytesHash) -> Self { hash.0 + // Chunks of 7 bytes since 8 bytes would allow collisions. .chunks(7) .map(|bytes| { let mut arr = [0; 8];