Обсуждение: pgsql: Increase the number of possible random seeds per time period.

Поиск
Список
Период
Сортировка

pgsql: Increase the number of possible random seeds per time period.

От
Thomas Munro
Дата:
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(-)


Re: pgsql: Increase the number of possible random seeds per time period.

От
Tom Lane
Дата:
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


Re: pgsql: Increase the number of possible random seeds per time period.

От
Thomas Munro
Дата:
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


Re: pgsql: Increase the number of possible random seeds per time period.

От
Tom Lane
Дата:
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