Spazio problema
Sono molto al di fuori del mio voto, sto cercando di capire
-
Quanta casualità fornisce effettivamente una chiamata a random () in PostgreSQL?
SELECT random();
-
Indipendentemente dal fatto che tu possa ragionevolmente indovinare quella gran casualità?
Che cosa so
-
So che non è così casuale come la gente vuole che sia, è solo inefficiente. Dopo aver concluso molto tempo fa che
md5()
è una perdita di tempo, posso solo confrontare le dimensioni.--produces "8" (in bytes) SELECT pg_column_size(random()); --produces "36" (in bytes) SELECT pg_column_size(md5(random()::text));
Questo è un sacco di spazio sprecato. So che possiamo memorizzare md5 () in UUID che impiegherà 16 byte. Ma sono ancora 8 byte di spazio di scarto dal nostro originale 8 byte random ().
-
So che PostgreSQL al momento genera numeri casuali come questo ,
result = (double) random() / ((double) MAX_RANDOM_VALUE + 1); PG_RETURN_FLOAT8(result);
E so che
PG_RETURN_FLOAT8(result)
è una macro che chiamaFloat8GetDatum(result)
. -
I documenti su
random()
dicono questo,The characteristics of the values returned by random() depend on the system implementation. It is not suitable for cryptographic applications; see pgcrypto module for an alternative.
-
Credo che 8 byte float, sia un float standard IEEE 754 sotto il cofano, anche dai documenti.
The data types real and double precision are inexact, variable-precision numeric types. In practice, these types are usually implementations of IEEE Standard 754 for Binary Floating-Point Arithmetic (single and double precision, respectively), to the extent that the underlying processor, operating system, and compiler support it.
-
So che la precisione completa di IEEE 754 supporta i seguenti stati che il nostro
random()
non supporta.- Numeri negativi
- Non-a-number
- Infinity
- Infinito negativo
-
So che IEEE riserva 11 bit per l'esponente , e siamo sicuri di averlo in una posizione che produce numeri nell'intervallo di
(0,1)
. Dai documenti ,random value in the range
0.0 <= x < 1.0
. -
Non sono sicuro di quanto accurato (preferirei che ciò sia verificato con le informazioni di cui sopra), ma per un Doppio documento di 8 byte dice
variable-precision, inexact 15 decimal digits precision
Con tutto questo c'è qualcuno abbastanza fluente in 754, e C per dirmi davvero quanto sia casuale una chiamata a random()
.
Perché sto chiedendo
Ho suggerito di generare le chiavi di sessione che non utilizzano md5(random()::text)
memorizzate nel testo, ma invece di usare pgcrypto
's gen_random_uuid()
ora mi chiedo quanto conta.