diff options
author | John Turner <jturner.usa@gmail.com> | 2025-09-14 21:17:57 -0400 |
---|---|---|
committer | John Turner <jturner.usa@gmail.com> | 2025-09-14 21:17:57 -0400 |
commit | ffbf2ff8165e0f10115a14e2e23970b8225bcca9 (patch) | |
tree | fe5b900d12d0d92676b81ea34ae061e1f94e7488 /src/main.cpp | |
parent | f76440c8ce8c80043459c54dbd722983772b534c (diff) | |
download | sqlite-kv-bench-ffbf2ff8165e0f10115a14e2e23970b8225bcca9.tar.gz |
use /dev/urandom to generate seed if none is provided
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 37 |
1 files 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 <array> #include <chrono> #include <cstdint> +#include <cstring> +#include <errno.h> +#include <fstream> #include <print> #include <random> #include <string> @@ -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<char, 8> 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 <database> <limit> [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()); |