15 std::ifstream m_source(source_file, std::ios::in | std::ios::binary);
16 assert(m_source.good());
18 std::array<char, std::tuple_size<hash_t>::value> dest{};
19 m_source.read(dest.data(), dest.size());
20 assert(m_source.gcount() ==
static_cast<std::streamsize
>(dest.size()));
21 std::array<
unsigned char,
sizeof(dest)> dest_unsigned{};
22 std::memcpy(dest_unsigned.data(), dest.data(), dest.size());
23 m_sha.Write(dest_unsigned.data(), dest_unsigned.size());
27 std::unique_lock<std::mutex> l(m_mut);
29 std::array<
unsigned char,
sizeof(ret)> ret_arr{};
30 for(
auto& v : ret_arr) {
32 auto h = hash_at_index(m_counter++);
40 std::memcpy(&ret, ret_arr.data(), ret_arr.size());
46 std::uniform_int_distribution<unsigned char> gen;
53 auto random_source::hash_at_index(uint64_t idx) ->
hash_t {
55 std::array<
unsigned char,
sizeof(idx)> idx_arr{};
56 std::memcpy(idx_arr.data(), &idx,
sizeof(idx));
57 m_sha.Write(idx_arr.data(),
sizeof(idx));
58 m_sha.Finalize(ret.data());
random_source(const std::string &source_file)
Constructor.
auto operator()() -> result_type
Returns a new random integer.
auto random_hash() -> hash_t
Returns a random 32-byte hash value.
std::array< unsigned char, cbdc::hash_size > hash_t
SHA256 hash container.
Pseudorandom number generator (PRNG) for generating random data from a given entropy source.