You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rust-twox-hash/twox-hash-1.6.2-Support-big...

79 lines
3.0 KiB

From 2fac078713ad979b8a56fcb5ccf5725d474c4325 Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Date: Fri, 4 Mar 2022 15:01:20 +0100
Subject: [PATCH] Support big-endian platforms
When using the UnalignedBuffer mechanism to operate on
multiple input bytes at once, the resulting u32 or u64
needs to be byte-swapped on big-endian platforms.
---
src/sixty_four.rs | 12 ++++++------
src/thirty_two.rs | 10 +++++-----
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/sixty_four.rs b/src/sixty_four.rs
index 9bd351c15..c15158693 100644
--- a/src/sixty_four.rs
+++ b/src/sixty_four.rs
@@ -65,10 +65,10 @@ impl XxCore {
let mut v4 = self.v4;
for [n1, n2, n3, n4] in values {
- v1 = ingest_one_number(v1, n1);
- v2 = ingest_one_number(v2, n2);
- v3 = ingest_one_number(v3, n3);
- v4 = ingest_one_number(v4, n4);
+ v1 = ingest_one_number(v1, n1.to_le());
+ v2 = ingest_one_number(v2, n2.to_le());
+ v3 = ingest_one_number(v3, n3.to_le());
+ v4 = ingest_one_number(v4, n4.to_le());
}
self.v1 = v1;
@@ -221,7 +221,7 @@ impl XxHash64 {
let mut buffered_u64s = UnalignedBuffer::<u64>::new(self.buffer.data());
for buffered_u64 in &mut buffered_u64s {
- let mut k1 = buffered_u64.wrapping_mul(PRIME_2);
+ let mut k1 = buffered_u64.to_le().wrapping_mul(PRIME_2);
k1 = k1.rotate_left(31);
k1 = k1.wrapping_mul(PRIME_1);
hash ^= k1;
@@ -232,7 +232,7 @@ impl XxHash64 {
let mut buffered_u32s = UnalignedBuffer::<u32>::new(buffered_u64s.remaining());
for buffered_u32 in &mut buffered_u32s {
- let k1 = u64::from(buffered_u32).wrapping_mul(PRIME_1);
+ let k1 = u64::from(buffered_u32.to_le()).wrapping_mul(PRIME_1);
hash ^= k1;
hash = hash.rotate_left(23);
hash = hash.wrapping_mul(PRIME_2);
diff --git a/src/thirty_two.rs b/src/thirty_two.rs
index 86b2b1957..cfa44cdbc 100644
--- a/src/thirty_two.rs
+++ b/src/thirty_two.rs
@@ -70,10 +70,10 @@ impl XxCore {
let mut v4 = self.v4;
for [n1, n2, n3, n4] in values {
- v1 = ingest_one_number(v1, n1);
- v2 = ingest_one_number(v2, n2);
- v3 = ingest_one_number(v3, n3);
- v4 = ingest_one_number(v4, n4);
+ v1 = ingest_one_number(v1, n1.to_le());
+ v2 = ingest_one_number(v2, n2.to_le());
+ v3 = ingest_one_number(v3, n3.to_le());
+ v4 = ingest_one_number(v4, n4.to_le());
}
self.v1 = v1;
@@ -211,7 +211,7 @@ impl XxHash32 {
let mut buffered_u32s = UnalignedBuffer::<u32>::new(self.buffer.data());
for buffered_u32 in &mut buffered_u32s {
- let k1 = buffered_u32.wrapping_mul(PRIME_3);
+ let k1 = buffered_u32.to_le().wrapping_mul(PRIME_3);
hash = hash.wrapping_add(k1);
hash = hash.rotate_left(17);
hash = hash.wrapping_mul(PRIME_4);