Me gustaría hacer una cadena aleatoria para usar en la verificación de la sesión usando PostgreSQL. Sé que puedo obtener un número aleatorio con SELECT random()
, así que lo intenté SELECT md5(random())
, pero no funciona. ¿Cómo puedo hacer esto?
postgresql
random
gersh
fuente
fuente
random()
no sea necesario). Si no es lo que supongo, entonces mi respuesta debe adaptarse a la pregunta refinada.Respuestas:
Sugeriría esta sencilla solución:
Esta es una función bastante simple que devuelve una cadena aleatoria de la longitud dada:
Y el uso:
Salida de ejemplo:
fuente
chars[1+random()*(array_length(chars, 1)-1)]
porchars[ceil(61 * random())]
random()
se llamalength
veces (como en muchas de las otras soluciones). ¿Existe una forma más eficaz de elegir entre 62 caracteres cada vez? ¿Cómo funciona esto en comparación conmd5()
?ORDER BY random()
. ¿Cual es mas rápido?Puede arreglar su intento inicial de esta manera:
Mucho más simple que algunas de las otras sugerencias. :-)
fuente
SELECT concat(md5(random()::text), md5(random()::text));
y si quisiera en algún lugar en el medio (50 caracteres, por ejemplo), podría tomar una subcadena de eso:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: más rápido, más aleatoriedad, almacenado de manera más eficiente en la base de datos.SELECT md5(random()::text||random()::text);
, oSELECT md5(random()::text||random()::text||random()::text);
Basándose en la solución de Marcin, podría hacer esto para usar un alfabeto arbitrario (en este caso, los 62 caracteres alfanuméricos ASCII):
fuente
Check out this for a totally different method using gen_random_uuid()
: más rápido, más aleatorio, almacenado de manera más eficiente en la base de datos.Puede obtener 128 bits aleatorios de un UUID. Este es el método para hacer el trabajo en PostgreSQL moderno.
También puede valer la pena leer los documentos sobre UUID
¿Qué tan rara es una colisión con UUID o adivinable? Asumiendo que son aleatorios
fuente: wikipedia
En resumen,
gen_random_uuid()
son 128 bits aleatorios almacenados en 128 bits (2 ** 128 combinaciones). 0-desperdicio.random()
solo genera 52 bits aleatorios en PostgreSQL (2 ** 52 combinaciones).md5()
almacenado como UUID es de 128 bits, pero solo puede ser tan aleatorio como su entrada ( 52 bits si se usarandom()
)md5()
almacenado como texto tiene 288 bits, pero solo puede ser tan aleatorio como su entrada ( 52 bits si se usarandom()
), más del doble del tamaño de un UUID y una fracción de la aleatoriedad)md5()
como hash, se puede optimizar tanto que no hace mucho.text
yvarchar
, etc., que se almacenan comovarlena
que tienen gastos generales para la longitud de la cadena.fuente
Estuve jugando con PostgreSQL recientemente, y creo que encontré una solución un poco mejor, usando solo métodos incorporados de PostgreSQL, sin pl / pgsql. La única limitación es que actualmente genera solo cadenas UPCASE, o números, o cadenas en minúsculas.
El segundo argumento del
generate_series
método dicta la longitud de la cadena.fuente
array_to_string(ARRAY(SELECT chr((65 + round((random()+my_id-my) * 25)) :: integer) FROM generate_series(1,8)), '')
array_to_string(ARRAY(SELECT chr((65 + round((random() * 25 + id) :: integer % 25 )) :: integer) FROM generate_series(1, 60)), '');
¡Utilice
string_agg
!Estoy usando esto con MD5 para generar un UUID también. Solo quiero un valor aleatorio con más bits que un
random ()
entero.fuente
random()
hasta obtener la cantidad de bits que quiero. Oh bien.Si bien no está activo de forma predeterminada, puede activar una de las extensiones principales:
Entonces su declaración se convierte en una simple llamada a gen_salt () que genera una cadena aleatoria:
El número inicial es un identificador de hash. Hay varios algoritmos disponibles, cada uno con su propio identificador:
Más información sobre extensiones:
EDITAR
Como lo indica Evan Carrol, a partir de la v9.4 puede usar
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
fuente
$1$
? Ese es un identificador de tipo hash (md5 == 1), el resto es el valor aleatorio.No creo que esté buscando una cadena aleatoria per se. Lo que necesitaría para la verificación de la sesión es una cadena que esté garantizada como única. ¿Almacena información de verificación de sesión para auditar? En ese caso, necesita que la cadena sea única entre sesiones. Conozco dos enfoques bastante simples:
Se garantiza que los UUID son únicos en virtud de su algoritmo de generación; de hecho, es extremadamente improbable que genere dos números idénticos en cualquier máquina, en cualquier momento (tenga en cuenta que esto es mucho más fuerte que en cadenas aleatorias, que tienen una periodicidad mucho menor que los UUID).
Debe cargar la extensión uuid-ossp para usar UUID. Una vez instalado, llame a cualquiera de las funciones uuid_generate_vXXX () disponibles en sus llamadas SELECT, INSERT o UPDATE. El tipo uuid es un número de 16 bytes, pero también tiene una representación de cadena.
fuente
El parámetro INTEGER define la longitud de la cadena. Garantizado para cubrir los 62 caracteres alfanuméricos con la misma probabilidad (a diferencia de otras soluciones que flotan en Internet).
fuente
Check out this for a totally different method using gen_random_uuid()
: más rápido, más aleatorio, almacenado de manera más eficiente en la base de datos.gen_random_uuid()
apareció en la versión 9.4, hasta donde yo sé, que fue lanzada el 18/12/2014, más de un año después de la respuesta que votó en contra. Detalles adicionales: la respuesta tiene solo 3 1/2 años :-) Pero tienes razón, ahora que lo tenemosgen_random_uuid()
, esto es lo que debería usarse. Por lo tanto, votaré a favor de su respuesta.@Kavius recomendó usar
pgcrypto
, pero en lugar degen_salt
, ¿de quégen_random_bytes
? ¿Y qué tal ensha512
lugar demd5
?Documentos:
fuente
select * from md5(to_char(random(), '0.9999999999999999'));
fuente
fuente