xref: /aosp_15_r20/external/libchrome/base/rand_util.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_RAND_UTIL_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_RAND_UTIL_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
9*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker #include <algorithm>
12*635a8641SAndroid Build Coastguard Worker #include <string>
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
15*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker namespace base {
18*635a8641SAndroid Build Coastguard Worker 
19*635a8641SAndroid Build Coastguard Worker // Returns a random number in range [0, UINT64_MAX]. Thread-safe.
20*635a8641SAndroid Build Coastguard Worker BASE_EXPORT uint64_t RandUint64();
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker // Returns a random number between min and max (inclusive). Thread-safe.
23*635a8641SAndroid Build Coastguard Worker BASE_EXPORT int RandInt(int min, int max);
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker // Returns a random number in range [0, range).  Thread-safe.
26*635a8641SAndroid Build Coastguard Worker BASE_EXPORT uint64_t RandGenerator(uint64_t range);
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker // Returns a random double in range [0, 1). Thread-safe.
29*635a8641SAndroid Build Coastguard Worker BASE_EXPORT double RandDouble();
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker // Given input |bits|, convert with maximum precision to a double in
32*635a8641SAndroid Build Coastguard Worker // the range [0, 1). Thread-safe.
33*635a8641SAndroid Build Coastguard Worker BASE_EXPORT double BitsToOpenEndedUnitInterval(uint64_t bits);
34*635a8641SAndroid Build Coastguard Worker 
35*635a8641SAndroid Build Coastguard Worker // Fills |output_length| bytes of |output| with random data. Thread-safe.
36*635a8641SAndroid Build Coastguard Worker //
37*635a8641SAndroid Build Coastguard Worker // Although implementations are required to use a cryptographically secure
38*635a8641SAndroid Build Coastguard Worker // random number source, code outside of base/ that relies on this should use
39*635a8641SAndroid Build Coastguard Worker // crypto::RandBytes instead to ensure the requirement is easily discoverable.
40*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void RandBytes(void* output, size_t output_length);
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker // Fills a string of length |length| with random data and returns it.
43*635a8641SAndroid Build Coastguard Worker // |length| should be nonzero. Thread-safe.
44*635a8641SAndroid Build Coastguard Worker //
45*635a8641SAndroid Build Coastguard Worker // Note that this is a variation of |RandBytes| with a different return type.
46*635a8641SAndroid Build Coastguard Worker // The returned string is likely not ASCII/UTF-8. Use with care.
47*635a8641SAndroid Build Coastguard Worker //
48*635a8641SAndroid Build Coastguard Worker // Although implementations are required to use a cryptographically secure
49*635a8641SAndroid Build Coastguard Worker // random number source, code outside of base/ that relies on this should use
50*635a8641SAndroid Build Coastguard Worker // crypto::RandBytes instead to ensure the requirement is easily discoverable.
51*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::string RandBytesAsString(size_t length);
52*635a8641SAndroid Build Coastguard Worker 
53*635a8641SAndroid Build Coastguard Worker // An STL UniformRandomBitGenerator backed by RandUint64.
54*635a8641SAndroid Build Coastguard Worker // TODO(tzik): Consider replacing this with a faster implementation.
55*635a8641SAndroid Build Coastguard Worker class RandomBitGenerator {
56*635a8641SAndroid Build Coastguard Worker  public:
57*635a8641SAndroid Build Coastguard Worker   using result_type = uint64_t;
min()58*635a8641SAndroid Build Coastguard Worker   static constexpr result_type min() { return 0; }
max()59*635a8641SAndroid Build Coastguard Worker   static constexpr result_type max() { return UINT64_MAX; }
operator()60*635a8641SAndroid Build Coastguard Worker   result_type operator()() const { return RandUint64(); }
61*635a8641SAndroid Build Coastguard Worker 
62*635a8641SAndroid Build Coastguard Worker   RandomBitGenerator() = default;
63*635a8641SAndroid Build Coastguard Worker   ~RandomBitGenerator() = default;
64*635a8641SAndroid Build Coastguard Worker };
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker // Shuffles [first, last) randomly. Thread-safe.
67*635a8641SAndroid Build Coastguard Worker template <typename Itr>
RandomShuffle(Itr first,Itr last)68*635a8641SAndroid Build Coastguard Worker void RandomShuffle(Itr first, Itr last) {
69*635a8641SAndroid Build Coastguard Worker   std::shuffle(first, last, RandomBitGenerator());
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX)
73*635a8641SAndroid Build Coastguard Worker BASE_EXPORT int GetUrandomFD();
74*635a8641SAndroid Build Coastguard Worker #endif
75*635a8641SAndroid Build Coastguard Worker 
76*635a8641SAndroid Build Coastguard Worker }  // namespace base
77*635a8641SAndroid Build Coastguard Worker 
78*635a8641SAndroid Build Coastguard Worker #endif  // BASE_RAND_UTIL_H_
79