Seeding in mini-gmp
nisse at lysator.liu.se
Thu Nov 24 16:36:07 UTC 2016
tg at gmplib.org (Torbjörn Granlund) writes:
> Should seeds really be limited to an unsigned long and at the same time
> to 4 bytes? Both limits seem unnecessary.
It's platform dependent. On 64-bit machines, unsigned long is 64 bits
(except windows...), and we read 8 bytes from /dev/random. Which ought
to be enough.
On 32-bit machines, using gmp_randseed_ui limits the seed to 32-bits. If
that's a problem, we need to fix it; I just tried to keep things simple.
> I haven't looked deeper into the code, but if there is a seed function
> which accepts an mpz_t, then please consider using it instead. And then
> follow GMP's example and read 6 bytes of random data from /dev/urandom.
There's gmp_randseed. I guess we could use that. Why 6 bytes (48
bits), and not, e.g., 64 bits?
Hmm, now I realize that it's quite important to be able to feed the same
seed to both 32-bit and 64-bit builds; then it's no good to use
gmp_randseed_ui with a platform-dependent range. I'll have to fix that.
> + /* Unsigned long may be only 32 bits, and then a plain microsecond
> + count would wrap around in only 71 minutes. So instead, xor
> + microseconds with the most significant second bits, which are
> + the least "random". */
> + return tv.tv_sec ^ (tv.tv_usec << 12);
> You probably need a cast there, else you'll typically end up with 32-bit
> arithmetic there. (Or even better, use mpz_t here too.)
For this piece of code, I don't think we have much use for more than
32-bits. Iff time_t (type of tv_sec) is 64-bit, we'll use the bits
saying whether or not we're beyond 2038, which isn't particularly
If we switch to using a 48-bit mpz_t instead, we could do this
differently and get a better range. E.g, low 48 bits of 1000000*tv_sec +
tv_usec would wraparound in almost 9 years, and tv_sec + tv_usec << 28
would also fill 48 bits and collide rarely.
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.
More information about the gmp-devel