From 124a9de309e41a40098b98eb25566a01f59dbb7d Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Wed, 6 Aug 2025 14:15:12 +0200 Subject: [PATCH] fix(checksum): always store xxh3 digests as little-endian for compat --- src/checksum.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/checksum.cpp b/src/checksum.cpp index 55ff8772..5ad5c14c 100644 --- a/src/checksum.cpp +++ b/src/checksum.cpp @@ -151,16 +151,20 @@ class checksum_evp : public checksum::impl { struct xxh3_64_policy { using result_type = XXH64_hash_t; + using canonical_type = XXH64_canonical_t; static constexpr auto reset = XXH3_64bits_reset; static constexpr auto update = XXH3_64bits_update; static constexpr auto digest = XXH3_64bits_digest; + static constexpr auto canonical = XXH64_canonicalFromHash; }; struct xxh3_128_policy { using result_type = XXH128_hash_t; + using canonical_type = XXH128_canonical_t; static constexpr auto reset = XXH3_128bits_reset; static constexpr auto update = XXH3_128bits_update; static constexpr auto digest = XXH3_128bits_digest; + static constexpr auto canonical = XXH128_canonicalFromHash; }; template @@ -182,9 +186,12 @@ class checksum_xxh3 : public checksum::impl { if (!state_) { return false; } - auto hash = Policy::digest(state_.get()); + typename Policy::canonical_type canonical; + Policy::canonical(&canonical, Policy::digest(state_.get())); state_.reset(); - ::memcpy(digest, &hash, sizeof(hash)); + // compat: we always store the digest in little-endian order :/ + std::ranges::reverse(canonical.digest); + ::memcpy(digest, &canonical, sizeof(canonical)); return true; }