]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
random-util: add random_u64_range() that acquires a random number from a certain...
authorLennart Poettering <lennart@poettering.net>
Wed, 11 Nov 2020 13:44:35 +0000 (14:44 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 14 Feb 2021 14:42:12 +0000 (15:42 +0100)
So far we have been quite sloppy with this and ignored modulus and range
bias. Let's do something about, and add the option to do better.

src/basic/random-util.c
src/basic/random-util.h

index c831f06dacf3790ca48ae2b2034ec0e7645cbfcd..eca818757170a4ce40a79ab02797e6703b4448ad 100644 (file)
@@ -494,3 +494,22 @@ int random_write_entropy(int fd, const void *seed, size_t size, bool credit) {
 
         return 1;
 }
+
+int random_u64_range(uint64_t m) {
+        uint64_t x, remainder;
+
+        /* Generates a random number in the range 0…m-1, unbiased. (Java's algorithm) */
+
+        if (m == 0) /* Let's take m == 0 as special case to return an integer from the full range */
+                return random_u64();
+        if (m == 1)
+                return 0;
+
+        remainder = UINT64_MAX % m;
+
+        do {
+                x = random_u64();
+        } while (x >= UINT64_MAX - remainder);
+
+        return x % m;
+}
index f661fc093aef703ff522504a85b1e2d08bad8cab..1d5fb60fa24674fbfbe8de7e42359be8d97a9f53 100644 (file)
@@ -40,3 +40,5 @@ int rdrand(unsigned long *ret);
 size_t random_pool_size(void);
 
 int random_write_entropy(int fd, const void *seed, size_t size, bool credit);
+
+int random_u64_range(uint64_t max);