diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2022-02-08 21:59:16 -0500 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2022-02-08 21:59:16 -0500 |
commit | 16d96024a58fe68226dde2f56ee3b94ecc20aade (patch) | |
tree | 340a543bb69b83854e8996285969bfc409c012dc | |
parent | eef9953dc4be439a474a3a67b72a7492bac02ae8 (diff) | |
download | libgit2-ethomson/prng2.tar.gz |
fixup! rand: introduce git_rand PRNGethomson/prng2
-rw-r--r-- | src/rand.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/src/rand.c b/src/rand.c index de0faf890..14a9776a6 100644 --- a/src/rand.c +++ b/src/rand.c @@ -27,6 +27,11 @@ static git_mutex state_lock; # define SEED_SHIFT 0 #endif +typedef union { + double f; + uint64_t d; +} bits; + #if defined(GIT_WIN32) GIT_INLINE(int) getseed(uint64_t *seed) { @@ -66,12 +71,10 @@ GIT_INLINE(int) getseed(uint64_t *seed) *seed ^= ((uint64_t)usertime.dwHighDateTime << 32); /* Mix in the addresses of some functions and variables */ - *seed ^= ((uint64_t)((void *)getseed) << SEED_SHIFT); - *seed ^= ((uint64_t)((void *)seed)); - *seed ^= ((uint64_t)((void *)printf) << SEED_SHIFT); - *seed ^= ((uint64_t)((void *)&errno)); + *seed ^= ((uint64_t)((size_t)((void *)seed)) << SEED_SHIFT); + *seed ^= ((uint64_t)((size_t)((void *)&errno))); - *seed ^= ((uint64_t)git__timer()); + *seed ^= ((bits)git__timer()).d; return 0; } @@ -84,7 +87,7 @@ GIT_INLINE(int) getseed(uint64_t *seed) double loadavg[3]; int fd; -# if defined(GIT_RAND_GETENTROPYZ) +# if defined(GIT_RAND_GETENTROPY) if (getentropy(seed, sizeof(uint64_t)) == 0) return 0; # endif @@ -109,27 +112,27 @@ GIT_INLINE(int) getseed(uint64_t *seed) return -1; } + getloadavg(loadavg, 3); + *seed |= ((uint64_t)tv.tv_usec << 40); *seed |= ((uint64_t)tv.tv_sec); - *seed ^= ((uint64_t)getpid() << 32); - *seed ^= ((uint64_t)getpgid(0)); + *seed ^= ((uint64_t)getpid() << 48); *seed ^= ((uint64_t)getppid() << 32); - *seed ^= ((uint64_t)getsid(0)); - *seed ^= ((uint64_t)getuid() << 32); + *seed ^= ((uint64_t)getpgid(0) << 28); + *seed ^= ((uint64_t)getsid(0) << 16); + *seed ^= ((uint64_t)getuid() << 8); *seed ^= ((uint64_t)getgid()); - *seed ^= ((uint64_t)loadavg[0]); - *seed ^= ((uint64_t)loadavg[1]); - *seed ^= ((uint64_t)loadavg[2]); + *seed ^= (((bits)loadavg[0]).d >> 36); + *seed ^= (((bits)loadavg[1]).d); + *seed ^= (((bits)loadavg[2]).d >> 16); - /* Mix in the addresses of some functions and variables */ - *seed ^= ((uint64_t)((size_t)((void *)getseed)) << SEED_SHIFT); - *seed ^= ((uint64_t)((size_t)((void *)seed))); - *seed ^= ((uint64_t)((size_t)((void *)printf)) << SEED_SHIFT); - *seed ^= ((uint64_t)((size_t)((void *)&errno))); + *seed ^= ((bits)git__timer()).d; - *seed ^= ((uint64_t)git__timer()); + /* Mix in the addresses of some variables */ + *seed ^= ((uint64_t)((size_t)((void *)seed)) << 32); + *seed ^= ((uint64_t)((size_t)((void *)&errno))); return 0; } |