diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/random_provider | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/random_provider')
-rw-r--r-- | library/cpp/random_provider/random_provider.cpp | 75 | ||||
-rw-r--r-- | library/cpp/random_provider/random_provider.h | 14 | ||||
-rw-r--r-- | library/cpp/random_provider/ya.make | 13 |
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() |