|
|
@ -3,7 +3,7 @@ use crate::{ |
|
|
|
ByteReader, ByteWriter, Deserializable, DeserializationError, Digest, Felt, Serializable,
|
|
|
|
StarkField, String, ZERO,
|
|
|
|
};
|
|
|
|
use core::ops::Deref;
|
|
|
|
use core::{cmp::Ordering, ops::Deref};
|
|
|
|
|
|
|
|
// DIGEST TRAIT IMPLEMENTATIONS
|
|
|
|
// ================================================================================================
|
|
|
@ -96,6 +96,36 @@ impl Deref for RpoDigest256 { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Ord for RpoDigest256 {
|
|
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
|
|
// compare the inner u64 of both elements.
|
|
|
|
//
|
|
|
|
// it will iterate the elements and will return the first computation different than
|
|
|
|
// `Equal`. Otherwise, the ordering is equal.
|
|
|
|
//
|
|
|
|
// the endianness is irrelevant here because since, this being a cryptographically secure
|
|
|
|
// hash computation, the digest shouldn't have any ordered property of its input.
|
|
|
|
//
|
|
|
|
// finally, we use `Felt::inner` instead of `Felt::as_int` so we avoid performing a
|
|
|
|
// montgomery reduction for every limb. that is safe because every inner element of the
|
|
|
|
// digest is guaranteed to be in its canonical form (that is, `x in [0,p)`).
|
|
|
|
self.0
|
|
|
|
.iter()
|
|
|
|
.map(Felt::inner)
|
|
|
|
.zip(other.0.iter().map(Felt::inner))
|
|
|
|
.fold(Ordering::Equal, |ord, (a, b)| match ord {
|
|
|
|
Ordering::Equal => a.cmp(&b),
|
|
|
|
_ => ord,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PartialOrd for RpoDigest256 {
|
|
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
|
|
Some(self.cmp(other))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TESTS
|
|
|
|
// ================================================================================================
|
|
|
|
|
|
|
|