diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-06-29 18:57:59 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-06-29 18:57:59 -0400 |
commit | 485cab869d292becb62a43b2e33a399ebc671303 (patch) | |
tree | 7052a37a6c36d67cb7d48524766103890545e487 /src/common | |
parent | bea55766af461e4ca78a4919912f3aa9de978bdc (diff) | |
parent | b111a7cd9c5e09bedf57a67f9044a2974222cd11 (diff) | |
download | tor-485cab869d292becb62a43b2e33a399ebc671303.tar.gz tor-485cab869d292becb62a43b2e33a399ebc671303.zip |
Merge remote branch 'public/rand_double2'
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/crypto.c | 20 | ||||
-rw-r--r-- | src/common/crypto.h | 1 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index 06b6aa4b51..1d75555b2f 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -2067,6 +2067,26 @@ crypto_rand_uint64(uint64_t max) } } +/** Return a pseudorandom double d, chosen uniformly from the range + * 0.0 <= d < 1.0. + */ +double +crypto_rand_double(void) +{ + /* We just use an unsigned int here; we don't really care about getting + * more than 32 bits of resolution */ + unsigned int uint; + crypto_rand((char*)&uint, sizeof(uint)); +#if SIZEOF_INT == 4 +#define UINT_MAX_AS_DOUBLE 4294967296.0 +#elif SIZEOF_INT == 8 +#define UINT_MAX_AS_DOUBLE 1.8446744073709552e+19 +#else +#error SIZEOF_INT is neither 4 nor 8 +#endif + return ((double)uint) / UINT_MAX_AS_DOUBLE; +} + /** Generate and return a new random hostname starting with <b>prefix</b>, * ending with <b>suffix</b>, and containing no less than * <b>min_rand_len</b> and no more than <b>max_rand_len</b> random base32 diff --git a/src/common/crypto.h b/src/common/crypto.h index 1b004dd4b8..a30e5bcbae 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -210,6 +210,7 @@ int crypto_seed_rng(int startup); int crypto_rand(char *to, size_t n); int crypto_rand_int(unsigned int max); uint64_t crypto_rand_uint64(uint64_t max); +double crypto_rand_double(void); char *crypto_random_hostname(int min_rand_len, int max_rand_len, const char *prefix, const char *suffix); |