Eu gostaria de fazer uma string aleatória para usar na verificação de sessão usando PostgreSQL. Eu sei que posso obter um número aleatório com SELECT random()
, então tentei SELECT md5(random())
, mas não funcionou. Como posso fazer isso?
postgresql
random
gersh
fonte
fonte
random()
ness não é necessário). Se não for o que presumo, então minha resposta deve ser direcionada para a pergunta refinada.Respostas:
Eu sugeriria esta solução simples:
Esta é uma função bastante simples que retorna uma string aleatória do comprimento fornecido:
E o uso:
Exemplo de saída:
fonte
chars[1+random()*(array_length(chars, 1)-1)]
porchars[ceil(61 * random())]
random()
é chamadolength
vezes (como em muitas das outras soluções). Existe uma maneira mais eficiente de escolher entre 62 caracteres de cada vez? Como isso funciona em comparação commd5()
?ORDER BY random()
. O que é mais rápido?Você pode corrigir sua tentativa inicial desta forma:
Muito mais simples do que algumas das outras sugestões. :-)
fonte
SELECT concat(md5(random()::text), md5(random()::text));
E se quiser algum lugar no meio (50 caracteres, por exemplo), você pode pegar uma substring disso:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: mais rápido, mais aleatoriedade, mais eficientemente armazenado no banco de dados.SELECT md5(random()::text||random()::text);
, ouSELECT md5(random()::text||random()::text||random()::text);
Com base na solução de Marcin, você poderia fazer isso para usar um alfabeto arbitrário (neste caso, todos os 62 caracteres alfanuméricos ASCII):
fonte
Check out this for a totally different method using gen_random_uuid()
: mais rápido, mais aleatório, mais eficientemente armazenado no banco de dados.Você pode obter 128 bits aleatórios de um UUID. Este é o método para realizar o trabalho no PostgreSQL moderno.
Pode valer a pena ler a documentação no UUID também
Quão rara é uma colisão com UUID ou adivinhada? Supondo que sejam aleatórios,
fonte: wikipedia
Em suma,
gen_random_uuid()
é 128 bits aleatórios armazenados em 128 bits (2 ** 128 combinações). 0-desperdício.random()
gera apenas 52 bits aleatórios no PostgreSQL (2 ** 52 combinações).md5()
armazenado como UUID tem 128 bits, mas só pode ser tão aleatório quanto sua entrada ( 52 bits se estiver em usorandom()
)md5()
armazenado como texto tem 288 bits, mas só pode ser tão aleatório quanto sua entrada ( 52 bits se estiver usandorandom()
) - mais de duas vezes o tamanho de um UUID e uma fração da aleatoriedade)md5()
como hash, pode ser tão otimizado que não faz muita coisa efetivamente.text
evarchar
, etc, que armazenam como umvarlena
que tem sobrecarga para o comprimento da string.fonte
Eu estava brincando com o PostgreSQL recentemente e acho que encontrei uma solução um pouco melhor, usando apenas métodos PostgreSQL embutidos - sem pl / pgsql. A única limitação é que atualmente gera apenas strings UPCASE, ou números, ou strings em minúsculas.
O segundo argumento do
generate_series
método determina o comprimento da string.fonte
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)), '');
Por favor, use
string_agg
!Estou usando isso com MD5 para gerar um UUID também. Eu só quero um valor aleatório com mais bits do que um
random ()
inteiro.fonte
random()
até obter o número de bits que desejo. Ah bem.Embora não esteja ativo por padrão, você pode ativar uma das extensões principais:
Então sua declaração se torna uma chamada simples para gen_salt () que gera uma string aleatória:
O número inicial é um identificador hash. Vários algoritmos estão disponíveis, cada um com seu próprio identificador:
Mais informações sobre extensões:
EDITAR
Conforme indicado por Evan Carrol, a partir da v9.4 você pode usar
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
fonte
$1$
? Esse é um identificador de tipo hash (md5 == 1), o resto é o valor aleatório.Não acho que você esteja procurando uma string aleatória por si só. O que você precisa para a verificação da sessão é uma string com garantia de exclusividade. Você armazena informações de verificação de sessão para auditoria? Nesse caso, você precisa que a string seja exclusiva entre as sessões. Eu conheço duas abordagens bastante simples:
Os UUIDs têm a garantia de serem exclusivos em virtude de seu algoritmo de geração; efetivamente, é extremamente improvável que você gere dois números idênticos em qualquer máquina, a qualquer momento, nunca (observe que isso é muito mais forte do que em strings aleatórias, que têm uma periodicidade muito menor do que UUIDs).
Você precisa carregar a extensão uuid-ossp para usar UUIDs. Uma vez instalado, chame qualquer uma das funções uuid_generate_vXXX () disponíveis em suas chamadas SELECT, INSERT ou UPDATE. O tipo uuid é um numeral de 16 bytes, mas também tem uma representação de string.
fonte
O parâmetro INTEGER define o comprimento da string. Garantido para cobrir todos os 62 caracteres alfanuméricos com a mesma probabilidade (ao contrário de algumas outras soluções flutuando na Internet).
fonte
Check out this for a totally different method using gen_random_uuid()
: mais rápido, mais aleatório, mais eficientemente armazenado no banco de dados.gen_random_uuid()
apareceu na versão 9.4, pelo que eu posso dizer, que foi lançada em 2014-12-18, mais de um ano após a resposta que você votou negativamente. Detalhes adicionais: a resposta tem apenas 3 anos e meio :-) Mas você está certo, agora que temosgen_random_uuid()
, é isso que deve ser usado. Portanto, irei aprovar sua resposta.@Kavius recomendou usar
pgcrypto
, mas em vez degen_salt
, e quantogen_random_bytes
? E que tal emsha512
vez demd5
?Docs:
fonte
select * from md5(to_char(random(), '0.9999999999999999'));
fonte
fonte