Обсуждение: pgsql: Increase the number of possible random seeds per time period.
Increase the number of possible random seeds per time period. Commit 197e4af9 refactored the initialization of the libc random() seed, but reduced the number of possible seeds values that could be chosen in a given time period. This negation of the effects of commit 98c50656c was unintentional. Replace with code that shifts the fast moving timestamp bits left, similar to the original algorithm (though not the previous float-tolerating coding, which is no longer necessary). Author: Thomas Munro Reported-by: Noah Misch Reviewed-by: Tom Lane Discussion: https://postgr.es/m/20181112083358.GA1073796%40rfd.leadboat.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/5b0ce3ec334bb65bbab4aba78f204f986c356e80 Modified Files -------------- src/backend/postmaster/postmaster.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
Thomas Munro <tmunro@postgresql.org> writes: > Increase the number of possible random seeds per time period. Um, this bit is *not* right: + ((unsigned int) MyStartTimestamp >> 20)); You're cutting it down to 32 bits and then right shifting, which means you are shifting in a lot of zeroes when you could be shifting in something that's not quite as predetermined. I had in mind to do the shifts in uint64 arithmetic and then narrow the final XOR result to int (maybe let the compiler do that implicitly). regards, tom lane
On Thu, Nov 15, 2018 at 4:38 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > Thomas Munro <tmunro@postgresql.org> writes: > > Increase the number of possible random seeds per time period. > > Um, this bit is *not* right: > > + ((unsigned int) MyStartTimestamp >> 20)); > > You're cutting it down to 32 bits and then right shifting, which > means you are shifting in a lot of zeroes when you could be shifting > in something that's not quite as predetermined. I had in mind to do > the shifts in uint64 arithmetic and then narrow the final XOR result > to int (maybe let the compiler do that implicitly). Will this close the case? - srandom(((unsigned int) MyProcPid) ^ - ((unsigned int) MyStartTimestamp << 12) ^ - ((unsigned int) MyStartTimestamp >> 20)); + srandom(((uint64) MyProcPid) ^ + ((uint64) MyStartTimestamp << 12) ^ + ((uint64) MyStartTimestamp >> 20)); -- Thomas Munro http://www.enterprisedb.com
Thomas Munro <thomas.munro@enterprisedb.com> writes: > On Thu, Nov 15, 2018 at 4:38 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: >> Um, this bit is *not* right: > Will this close the case? > - srandom(((unsigned int) MyProcPid) ^ > - ((unsigned int) MyStartTimestamp << 12) ^ > - ((unsigned int) MyStartTimestamp >> 20)); > + srandom(((uint64) MyProcPid) ^ > + ((uint64) MyStartTimestamp << 12) ^ > + ((uint64) MyStartTimestamp >> 20)); WFM. regards, tom lane