mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
r8825@totoro: nickm | 2006-10-01 17:41:27 -0400
Add function to return a random uint64_t. svn:r8570
This commit is contained in:
parent
f6e165ea01
commit
219ad6395c
@ -1645,6 +1645,28 @@ crypto_rand_int(unsigned int max)
|
||||
}
|
||||
}
|
||||
|
||||
/** Return a pseudorandom integer, chosen uniformly from the values
|
||||
* between 0 and max-1. */
|
||||
uint64_t
|
||||
crypto_rand_uint64(uint64_t max)
|
||||
{
|
||||
uint64_t val;
|
||||
uint64_t cutoff;
|
||||
tor_assert(max < UINT64_MAX);
|
||||
tor_assert(max > 0); /* don't div by 0 */
|
||||
|
||||
/* We ignore any values that are >= 'cutoff,' to avoid biasing the
|
||||
* distribution with clipping at the upper end of unsigned int's
|
||||
* range.
|
||||
*/
|
||||
cutoff = UINT64_MAX - (UINT64_MAX%max);
|
||||
while (1) {
|
||||
crypto_rand((char*)&val, sizeof(val));
|
||||
if (val < cutoff)
|
||||
return val % max;
|
||||
}
|
||||
}
|
||||
|
||||
/** Return a randomly chosen element of sl; or NULL if sl is empty.
|
||||
*/
|
||||
void *
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define CRYPTO_H_ID "$Id$"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "torint.h"
|
||||
|
||||
/** Length of the output of our message digest. */
|
||||
#define DIGEST_LEN 20
|
||||
@ -152,6 +153,7 @@ int crypto_expand_key_material(const char *key_in, size_t in_len,
|
||||
int crypto_seed_rng(void);
|
||||
int crypto_rand(char *to, size_t n);
|
||||
int crypto_rand_int(unsigned int max);
|
||||
uint64_t crypto_rand_uint64(uint64_t max);
|
||||
|
||||
struct smartlist_t;
|
||||
void *smartlist_choose(const struct smartlist_t *sl);
|
||||
|
Loading…
Reference in New Issue
Block a user