diff options
author | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:14 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:14 +0200 |
commit | 6d11bb4a2d5bc8ab7c1491639f1083532b1b8fd1 (patch) | |
tree | 0a1ee125b7c5ef7ec37ff0781392989be4f75e26 /src/seed.hpp | |
parent | 36969a9058806e71078efcb04a91cc263612d42e (diff) |
Replace RNG with PCG random number generator
Diffstat (limited to 'src/seed.hpp')
-rw-r--r-- | src/seed.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/seed.hpp b/src/seed.hpp new file mode 100644 index 00000000..91ec7eba --- /dev/null +++ b/src/seed.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include <array> +#include <cstdint> + +class seed_t { + +public: + // Number of seed bytes. + static constexpr std::size_t n_bytes = 64; + + // Sanity check; we're relying on converting to uint32_t elsewhere, + // so let's just keep it as easy as possible. + static_assert(n_bytes % 4 == 0, "n_bytes must be multiple of 4"); + + // Number of uint32_t's required to store the seed. + static constexpr std::size_t n_uint32 = n_bytes / 4; + +private: + std::array<std::uint8_t, n_bytes> m_data; + + // Default constructor is private. Use the static + // factory functions instead. + seed_t() + { + // Factory functions do explicit initialization. + }; + +public: + + /** + * Create a seed from system entropy. + */ + static seed_t system(); + + /** + * Create a seed from the given bytes. + */ + static seed_t from_bytes(std::uint8_t bytes[n_bytes]); + + /** + * Convert seed to bytes. + */ + void to_bytes(std::uint8_t bytes[n_bytes]) const; + + /** + * Convert seed to uint32_t's suitable for seed_seq. + */ + void to_uint32(std::uint32_t seed_seq_data[n_uint32]) const; + +}; |