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.