Espacio de problemas
Estoy fuera de mi grado de pago, estoy tratando de averiguar
-
¿Cuánta aleatoriedad realmente proporciona una llamada a random () en PostgreSQL?
SELECT random();
¿Puedes o no adivinar razonablemente esa aleatoriedad?
Lo que sé
-
Sé que no es tan aleatorio como la gente quiere que sea, es simplemente ineficiente. Habiendo concluido hace mucho tiempo que
md5()
es una pérdida de tiempo, simplemente puedo comparar los tamaños.--produces "8" (in bytes) SELECT pg_column_size(random()); --produces "36" (in bytes) SELECT pg_column_size(md5(random()::text));
Eso es un montón de espacio desperdiciado. Sé que podemos almacenar md5 () en UUID que tendrá 16 bytes. Pero, eso sigue siendo 8 bytes de espacio de desecho de nuestro original de 8 bytes aleatorios ().
-
Sé que PostgreSQL genera actualmente números de este artículo a>,
result = (double) random() / ((double) MAX_RANDOM_VALUE + 1); PG_RETURN_FLOAT8(result);
Y, sé que
PG_RETURN_FLOAT8(result)
es una macro que llama a % . -
Los documentos en
Float8GetDatum(result)
dicen esto,Las características de los valores devueltos por random () dependen de la implementación del sistema. No es adecuado para aplicaciones criptográficas; vea el módulo pgcrypto para una alternativa.
-
Creo que el flotador de 8 bytes, es un flotador IEEE estándar 754 debajo del capó, también de los documentos.
Los tipos de datos de precisión real y doble son inexactos, tipos numéricos de precisión variable. En la práctica, estos tipos suelen ser implementaciones de IEEE Standard 754 para aritmética de punto flotante binario (precisión simple y doble, respectivamente), en la medida en que el procesador subyacente, el sistema operativo y el compilador lo admiten.
-
Sé que la precisión total de IEEE 754 admite los siguientes estados que no admite nuestro
random()
.- Números negativos
- No es un número
- infinito
- Infinito negativo
-
Sé que IEEE reserva 11 bits para el exponente , y estamos seguros de que tenemos eso en una posición que produce números en el rango de
random()
. De los documentos ,valor aleatorio en el rango
(0,1)
. -
No estoy seguro de la precisión (preferiría que esto se verifique con la información anterior), pero para un El doble de 8 bytes que dicen los documentos
precisión variable, precisión de 15 dígitos decimales inexacta
Con todo eso, hay alguien lo suficientemente fluido en 754, y C para decirme realmente cuán aleatoriamente es una llamada a 0.0 <= x < 1.0
.
Por qué estoy preguntando
Hice una sugerencia para generar claves de sesión que no utilicen random()
almacenadas en el texto, sino que utilicen md5(random()::text)
's pgcrypto
ahora. Me pregunto cuánto importa.