From 0941d7d364f70c22b80b40acbd39a5df3ff50988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:53:29 +0100 Subject: [PATCH] Multi threaded random generator --- nano/core_test/CMakeLists.txt | 1 + nano/core_test/random.cpp | 3 +++ nano/lib/random.hpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 nano/core_test/random.cpp diff --git a/nano/core_test/CMakeLists.txt b/nano/core_test/CMakeLists.txt index 6f5943f08..05ba59a57 100644 --- a/nano/core_test/CMakeLists.txt +++ b/nano/core_test/CMakeLists.txt @@ -40,6 +40,7 @@ add_executable( optimistic_scheduler.cpp processing_queue.cpp processor_service.cpp + random.cpp random_pool.cpp rep_crawler.cpp receivable.cpp diff --git a/nano/core_test/random.cpp b/nano/core_test/random.cpp new file mode 100644 index 000000000..921736155 --- /dev/null +++ b/nano/core_test/random.cpp @@ -0,0 +1,3 @@ +#include + +#include diff --git a/nano/lib/random.hpp b/nano/lib/random.hpp index f2f35a7e2..be4dde06a 100644 --- a/nano/lib/random.hpp +++ b/nano/lib/random.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace nano @@ -28,4 +29,32 @@ private: std::random_device device; std::default_random_engine rng{ device () }; }; + +/** + * Not safe for any crypto related code, use for non-crypto PRNG only. + * Thread safe. + */ +class random_generator_mt final +{ +public: + /// Generate a random number in the range [min, max) + auto random (auto min, auto max) + { + release_assert (min < max); + std::lock_guard lock{ mutex }; + std::uniform_int_distribution dist (min, max - 1); + return dist (rng); + } + + /// Generate a random number in the range [0, max) + auto random (auto max) + { + return random (decltype (max){ 0 }, max); + } + +private: + std::random_device device; + std::default_random_engine rng{ device () }; + std::mutex mutex; +}; } \ No newline at end of file