From 2fac078713ad979b8a56fcb5ccf5725d474c4325 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand 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::::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::::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::::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);