aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/random_provider
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/random_provider
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/random_provider')
-rw-r--r--library/cpp/random_provider/random_provider.cpp75
-rw-r--r--library/cpp/random_provider/random_provider.h14
-rw-r--r--library/cpp/random_provider/ya.make13
3 files changed, 102 insertions, 0 deletions
diff --git a/library/cpp/random_provider/random_provider.cpp b/library/cpp/random_provider/random_provider.cpp
new file mode 100644
index 0000000000..64cb48b8b7
--- /dev/null
+++ b/library/cpp/random_provider/random_provider.cpp
@@ -0,0 +1,75 @@
+#include "random_provider.h"
+#include <util/random/mersenne.h>
+#include <util/random/random.h>
+#include <util/system/unaligned_mem.h>
+
+namespace {
+ void SetV4(TGUID& g) {
+ g.dw[1] &= 0x0fffffff;
+ g.dw[1] |= 0x40000000;
+
+ g.dw[2] &= 0xffffff3f;
+ g.dw[2] |= 0x00000080;
+ }
+}
+
+class TDefaultRandomProvider: public IRandomProvider {
+public:
+ ui64 GenRand() noexcept override {
+ return RandomNumber<ui64>();
+ }
+
+ TGUID GenGuid() noexcept override {
+ TGUID ret;
+ CreateGuid(&ret);
+ return ret;
+ }
+
+ TGUID GenUuid4() noexcept override {
+ TGUID ret;
+ WriteUnaligned<ui64>(ret.dw, RandomNumber<ui64>());
+ WriteUnaligned<ui64>(ret.dw + 2, RandomNumber<ui64>());
+ SetV4(ret);
+ return ret;
+ }
+};
+
+class TDeterministicRandomProvider: public IRandomProvider {
+public:
+ TDeterministicRandomProvider(ui64 seed)
+ : Gen(seed)
+ {
+ }
+
+ ui64 GenRand() noexcept override {
+ return Gen.GenRand();
+ }
+
+ TGUID GenGuid() noexcept override {
+ TGUID ret;
+ WriteUnaligned<ui64>(ret.dw, Gen.GenRand());
+ ret.dw[2] = (ui32)Gen.GenRand();
+ ret.dw[3] = ++GuidCount;
+ return ret;
+ }
+
+ TGUID GenUuid4() noexcept override {
+ TGUID ret;
+ WriteUnaligned<ui64>(ret.dw, Gen.GenRand());
+ WriteUnaligned<ui64>(ret.dw + 2, Gen.GenRand());
+ SetV4(ret);
+ return ret;
+ }
+
+private:
+ TMersenne<ui64> Gen;
+ ui32 GuidCount = 0;
+};
+
+TIntrusivePtr<IRandomProvider> CreateDefaultRandomProvider() {
+ return TIntrusivePtr<IRandomProvider>(new TDefaultRandomProvider());
+}
+
+TIntrusivePtr<IRandomProvider> CreateDeterministicRandomProvider(ui64 seed) {
+ return TIntrusivePtr<IRandomProvider>(new TDeterministicRandomProvider(seed));
+}
diff --git a/library/cpp/random_provider/random_provider.h b/library/cpp/random_provider/random_provider.h
new file mode 100644
index 0000000000..6e7226866f
--- /dev/null
+++ b/library/cpp/random_provider/random_provider.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <util/generic/guid.h>
+#include <util/random/common_ops.h>
+
+class IRandomProvider: public TThrRefBase, public TCommonRNG<ui64, IRandomProvider> {
+public:
+ virtual TGUID GenGuid() noexcept = 0;
+ virtual TGUID GenUuid4() noexcept = 0;
+ virtual ui64 GenRand() noexcept = 0; // for TCommonRNG
+};
+
+TIntrusivePtr<IRandomProvider> CreateDefaultRandomProvider();
+TIntrusivePtr<IRandomProvider> CreateDeterministicRandomProvider(ui64 seed);
diff --git a/library/cpp/random_provider/ya.make b/library/cpp/random_provider/ya.make
new file mode 100644
index 0000000000..38d1f070e8
--- /dev/null
+++ b/library/cpp/random_provider/ya.make
@@ -0,0 +1,13 @@
+LIBRARY()
+
+OWNER(
+ g:kikimr
+ g:yql
+)
+
+SRCS(
+ random_provider.cpp
+ random_provider.h
+)
+
+END()