pub struct BHP<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> { /* private fields */ }Expand description
BHP is a collision-resistant hash function that takes a variable-length input. The BHP hash function does not behave like a random oracle, see Poseidon for one.
§Design
The BHP hash function splits the given input into blocks, and processes them iteratively.
The first iteration is initialized as follows:
DIGEST_0 = BHP([ 0...0 || DOMAIN || LENGTH(INPUT) || INPUT[0..BLOCK_SIZE] ]);Each subsequent iteration is initialized as follows:
DIGEST_N+1 = BHP([ DIGEST_N[0..DATA_BITS] || INPUT[(N+1)*BLOCK_SIZE..(N+2)*BLOCK_SIZE] ]);Implementations§
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Sourcepub fn setup(domain: &str) -> Result<Self>
pub fn setup(domain: &str) -> Result<Self>
Initializes a new instance of BHP with the given domain.
Sourcepub fn merkle_empty_hash(&self) -> Result<Field<E>>
pub fn merkle_empty_hash(&self) -> Result<Field<E>>
Returns the Merkle empty hash of this instance, computing it on first use.
This is PathHash::hash_children(0, 0) from snarkvm-console-collections, and
test_cached_empty_hash_matches_the_computed_one checks that the two agree. The
hash depends on the domain and bases, so it is cached per instance, not per type.
Sourcepub fn num_windows(&self) -> u8
pub fn num_windows(&self) -> u8
Returns the number of windows.
Sourcepub fn window_size(&self) -> u8
pub fn window_size(&self) -> u8
Returns the window size.
Trait Implementations§
Source§impl<E: Clone + Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Clone for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Clone + Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Clone for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Commit for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Commit for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> CommitUncompressed for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> CommitUncompressed for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§impl<E: Debug + Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Debug for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Debug + Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Debug for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§impl<'de, E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Deserialize<'de> for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<'de, E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Deserialize<'de> for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Hash for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Hash for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> HashUncompressed for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> HashUncompressed for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Source§fn hash_uncompressed(&self, input: &[Self::Input]) -> Result<Self::Output>
fn hash_uncompressed(&self, input: &[Self::Input]) -> Result<Self::Output>
Returns the BHP hash of the given input as an affine group element.
This uncompressed variant of the BHP hash function is provided to support the BHP commitment scheme, as it is typically not used by applications.
type Input = bool
type Output = Group<E>
Source§impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> PartialEq for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E: Environment, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> PartialEq for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Auto Trait Implementations§
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> !Freeze for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> RefUnwindSafe for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Send for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Sync for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> Unpin for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> UnsafeUnpin for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
impl<E, const NUM_WINDOWS: u8, const WINDOW_SIZE: u8> UnwindSafe for BHP<E, NUM_WINDOWS, WINDOW_SIZE>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<'de, T> DeserializeExt<'de> for Twhere
T: DeserializeOwned,
impl<'de, T> DeserializeExt<'de> for Twhere
T: DeserializeOwned,
fn take_from_value<D>(
value: &mut Value,
field: &str,
) -> Result<T, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more