aboutsummaryrefslogtreecommitdiff
path: root/absl/random/internal/randen_engine.h
diff options
context:
space:
mode:
authorMilad Fa <46688537+miladfarca@users.noreply.github.com>2021-10-29 15:51:54 -0400
committerGitHub <noreply@github.com>2021-10-29 15:51:54 -0400
commit022527c50e0e2bc937f9fa3c516e3e36cbba0845 (patch)
tree43eab7650ba5506b357fd846f9d0a8cc74ac1e84 /absl/random/internal/randen_engine.h
parentcc413f8b674d61e3aa948386432e526e051afca0 (diff)
downloadabseil-022527c50e0e2bc937f9fa3c516e3e36cbba0845.tar.gz
abseil-022527c50e0e2bc937f9fa3c516e3e36cbba0845.tar.bz2
abseil-022527c50e0e2bc937f9fa3c516e3e36cbba0845.zip
Fix Randen and PCG on Big Endian platforms (#1031)
Diffstat (limited to 'absl/random/internal/randen_engine.h')
-rw-r--r--absl/random/internal/randen_engine.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/absl/random/internal/randen_engine.h b/absl/random/internal/randen_engine.h
index 92bb8905..372c3ac2 100644
--- a/absl/random/internal/randen_engine.h
+++ b/absl/random/internal/randen_engine.h
@@ -121,6 +121,13 @@ class alignas(16) randen_engine {
const size_t requested_entropy = (entropy_size == 0) ? 8u : entropy_size;
std::fill(std::begin(buffer) + requested_entropy, std::end(buffer), 0);
seq.generate(std::begin(buffer), std::begin(buffer) + requested_entropy);
+#ifdef ABSL_IS_BIG_ENDIAN
+ // Randen expects the seed buffer to be in Little Endian; reverse it on
+ // Big Endian platforms.
+ for (sequence_result_type& e : buffer) {
+ e = absl::little_endian::FromHost(e);
+ }
+#endif
// The Randen paper suggests preferentially initializing even-numbered
// 128-bit vectors of the randen state (there are 16 such vectors).
// The seed data is merged into the state offset by 128-bits, which