From ffbf2ff8165e0f10115a14e2e23970b8225bcca9 Mon Sep 17 00:00:00 2001 From: John Turner Date: Sun, 14 Sep 2025 21:17:57 -0400 Subject: use /dev/urandom to generate seed if none is provided --- src/main.cpp | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 020f46b..67d92e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,9 @@ +#include #include #include +#include +#include +#include #include #include #include @@ -18,6 +22,25 @@ void parse_int(std::string_view arg, std::uint64_t &i) { } } +std::uint64_t random_u64() { + std::ifstream ifstream{"/dev/random", std::ios::binary}; + + if (!ifstream.is_open()) { + throw std::runtime_error( + std::format("failed to open /dev/random: {}", std::strerror(errno))); + } + + std::array buff; + + ifstream.read(buff.data(), 8); + + std::uint64_t i; + + std::memcpy(&i, buff.data(), 8); + + return i; +} + int main(int argc, char **argv) { if (argc < 3) { std::println(stderr, "usage: bench [seed]"); @@ -27,6 +50,8 @@ int main(int argc, char **argv) { auto *path = argv[1]; auto *limit = argv[2]; + std::println(stderr, "starting benchmark"); + std::uint64_t seed; if (argc > 3) { try { @@ -36,12 +61,15 @@ int main(int argc, char **argv) { return 1; } } else { - seed = std::chrono::system_clock::now().time_since_epoch().count(); + try { + seed = random_u64(); + } catch (std::exception &e) { + std::println(stderr, "{}", e.what()); + return 1; + } } - std::default_random_engine rng{seed}; - - std::println(stderr, "starting benchmark"); + std::println(stderr, "using random seed: {}", seed); boost::sqlite::connection connection{path}; @@ -54,6 +82,7 @@ int main(int argc, char **argv) { keys.push_back(key); } + std::default_random_engine rng{seed}; std::shuffle(keys.begin(), keys.end(), rng); std::println(stderr, "slurped {} keys into memory", keys.size()); -- cgit v1.2.3