Je voudrais créer une chaîne aléatoire à utiliser dans la vérification de session à l'aide de PostgreSQL. Je sais que je peux obtenir un nombre aléatoire avec SELECT random()
, alors j'ai essayé SELECT md5(random())
, mais cela ne fonctionne pas. Comment puis-je faire ceci?
postgresql
random
gersh
la source
la source
random()
n'est pas nécessaire). Si ce n'est pas ce que je suppose, ma réponse doit plutôt être adaptée à la question raffinée.Réponses:
Je suggérerais cette solution simple:
C'est une fonction assez simple qui renvoie une chaîne aléatoire de la longueur donnée:
Et l'utilisation:
Exemple de sortie:
la source
chars[1+random()*(array_length(chars, 1)-1)]
parchars[ceil(61 * random())]
random()
est appelélength
fois (comme dans la plupart des autres solutions). Existe-t-il un moyen plus efficace de choisir entre 62 caractères à chaque fois? Comment cela fonctionne-t-il par rapport àmd5()
?ORDER BY random()
. Lequel est plus vite?Vous pouvez corriger votre tentative initiale comme ceci:
Beaucoup plus simple que certaines des autres suggestions. :-)
la source
SELECT concat(md5(random()::text), md5(random()::text));
Et si vous vouliez quelque part au milieu (50 caractères par exemple), vous pourriez prendre une sous-chaîne de celle-ci:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stockée dans la base de données.SELECT md5(random()::text||random()::text);
, ouSELECT md5(random()::text||random()::text||random()::text);
En vous basant sur la solution de Marcin, vous pouvez le faire pour utiliser un alphabet arbitraire (dans ce cas, les 62 caractères alphanumériques ASCII):
la source
Check out this for a totally different method using gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stocké dans la base de données.Vous pouvez obtenir 128 bits aléatoires à partir d'un UUID. C'est la méthode pour faire le travail dans PostgreSQL moderne.
Cela vaut peut-être la peine de lire la documentation sur l'UUID aussi
Dans quelle mesure une collision avec l'UUID est-elle rare ou devinable? En supposant qu'ils sont aléatoires,
source: wikipedia
En résumé,
gen_random_uuid()
correspond à 128 bits d'aléa stockés sur 128 bits (2 ** 128 combinaisons). 0-déchet.random()
ne génère que 52 bits d'aléa dans PostgreSQL (2 ** 52 combinaisons).md5()
stocké comme UUID est de 128 bits, mais il ne peut être aussi aléatoire que son entrée ( 52 bits si vous utilisezrandom()
)md5()
stocké sous forme de texte est de 288 bits, mais il ne peut être aussi aléatoire que son entrée ( 52 bits si vous utilisezrandom()
) - plus de deux fois la taille d'un UUID et une fraction du caractère aléatoire)md5()
en tant que hachage, peut être tellement optimisé qu'il ne fait pas grand chose.text
etvarchar
, etc. qui stockent comme unvarlena
qui a une surcharge pour la longueur de la chaîne.la source
Je jouais avec PostgreSQL récemment, et je pense avoir trouvé une solution un peu meilleure, en utilisant uniquement des méthodes PostgreSQL intégrées - pas de pl / pgsql. La seule limitation est qu'il ne génère actuellement que des chaînes UPCASE, des nombres ou des chaînes en minuscules.
Le deuxième argument de la
generate_series
méthode dicte la longueur de la chaîne.la source
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)), '');
Veuillez utiliser
string_agg
!J'utilise ceci avec MD5 pour générer également un UUID. Je veux juste une valeur aléatoire avec plus de bits qu'un
random ()
entier.la source
random()
jusqu'à ce que j'obtienne le nombre de bits que je veux. Tant pis.Bien qu'il ne soit pas actif par défaut, vous pouvez activer l'une des extensions principales:
Ensuite, votre instruction devient un simple appel à gen_salt () qui génère une chaîne aléatoire:
Le premier nombre est un identifiant de hachage. Plusieurs algorithmes sont disponibles chacun avec leur propre identifiant:
Plus d'informations sur les extensions:
ÉDITER
Comme indiqué par Evan Carrol, à partir de la v9.4, vous pouvez utiliser
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
la source
$1$
? C'est un identifiant de type de hachage (md5 == 1), le reste est la valeur aléatoire.Je ne pense pas que vous recherchiez une chaîne aléatoire en soi. Ce dont vous auriez besoin pour la vérification de session, c'est une chaîne qui est garantie d'être unique. Stockez-vous les informations de vérification de session pour l'audit? Dans ce cas, vous avez besoin que la chaîne soit unique entre les sessions. Je connais deux approches assez simples:
Les UUID sont garantis uniques en vertu de leur algorithme de génération; en fait, il est extrêmement improbable que vous génériez deux nombres identiques sur n'importe quelle machine, à tout moment, jamais (notez que c'est beaucoup plus fort que sur des chaînes aléatoires, qui ont une périodicité beaucoup plus petite que les UUID).
Vous devez charger l'extension uuid-ossp pour utiliser les UUID. Une fois installé, appelez l'une des fonctions uuid_generate_vXXX () disponibles dans vos appels SELECT, INSERT ou UPDATE. Le type uuid est un nombre de 16 octets, mais il a également une représentation sous forme de chaîne.
la source
Le paramètre INTEGER définit la longueur de la chaîne. Garanti pour couvrir les 62 caractères alphanum avec une probabilité égale (contrairement à certaines autres solutions flottant sur Internet).
la source
Check out this for a totally different method using gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stocké dans la base de données.gen_random_uuid()
est apparu dans la version 9.4 pour autant que je sache, qui a été publiée le 18/12/2014, plus d'un an après la réponse que vous avez déclinée. Petit bout supplémentaire: la réponse n'a que 3 ans et demi :-) Mais vous avez raison, maintenant que nous l'avonsgen_random_uuid()
, c'est ce qu'il faut utiliser. Par conséquent, je vais voter pour votre réponse.@Kavius a recommandé d'utiliser
pgcrypto
, mais au lieu degen_salt
, qu'en est-ilgen_random_bytes
? Et que diriez-voussha512
au lieu demd5
?Documents:
la source
select * from md5(to_char(random(), '0.9999999999999999'));
la source
la source