Comment voulez-vous créer une chaîne de caractères aléatoires qui convient à un ID de session dans PostgreSQL?
Je voudrais faire une chaîne de caractères aléatoires pour une utilisation dans la session de vérification de l'utilisation de PostgreSQL. Je sais que je peux obtenir un nombre aléatoire avec SELECT random()
, j'ai donc essayé SELECT md5(random())
, mais qui ne fonctionne pas. Comment puis-je faire cela?
- Une autre solution peut être trouvée ici stackoverflow.com/a/13675441/398670
- La question d'origine clairement parle de l'aléatoire ayant une valeur au-delà de l'apparence. J'ai mis à jour le titre de la question afin de refléter @gersh de l'intention.
- J'ai édité le titre pour que des réponses encore faire parfaitement bon sens, et Evan répondre en apportant des choses un peu plus moderne, s'adapte aussi bien. Je ne veux pas verrouiller cette vieille question pour une teneur en litige - donc, nous allons faire tout des modifications supplémentaires en s'adaptant à toutes les réponses s'il vous plaît.
- Cool, nous allons voir si @gersh peut clarifier cette question, car il y a désaccord légitime quant à son intention initiale. Si son intention première est ce que j'ai supposé qu'il était, un grand nombre de ces réponses doivent être ajustés, downvoted ou rétractée. Et, peut-être une nouvelle question sur la génération de chaînes à des fins de test (ou similaire) doit être soulevée (où
random()
ness n'est pas nécessaire). Si ce n'est pas ce que je suppose, alors ma réponse doit être pris en charge à l'raffiné question de la place. - gersh été vu la dernière fois Nov 21 2015.
- Pour toute personne venant à cette question dans l'année " > 2017 envisager Evan réponse de stackoverflow.com/a/41608000/190234 comme il utilise les méthodes qui n'étaient pas disponibles lors de l'interrogatio des réserves initialement posées et répondues.
Vous devez vous connecter pour publier un commentaire.
Je vous suggère cette solution simple:
C'est assez simple fonction qui retourne une chaîne aléatoire de la longueur donnée:
Et l'utilisation:
Exemple de sortie:
chars[1+random()*(array_length(chars, 1)-1)]
avecchars[ceil(61 * random())]
random()
est appeléelength
fois (comme dans beaucoup d'autres solutions). Est-il un moyen plus efficace de choisir à partir de 62 caractères à chaque fois? Comment est-ce par rapport àmd5()
?ORDER BY random()
. Ce qui est plus rapide?Check out this for a totally different method using gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stockées dans la base de données.Vous pouvez fixer votre première tentative comme ceci:
Beaucoup plus simple que celle de certains autres suggestions. 🙂
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 que:SELECT substr(concat(md5(random()::text), md5(random()::text)), 0, 50);
gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stockées dans la base de données.SELECT md5(random()::text||random()::text);
, ouSELECT md5(random()::text||random()::text||random()::text);
Bâtiment sur Marcin la solution, vous pouvez le faire à l'utilisation arbitraire de l'alphabet (dans ce cas, tous les 62 caractères alphanumériques ASCII):
Check out this for a totally different method using gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stockées dans la base de données.Vous pouvez obtenir 128 bits aléatoires à partir d'un UUID. C'est la méthode pour obtenir le travail fait dans la moderne PostgreSQL.
Peut être intéressant de lire les docs sur l'UUID de trop
Comment rare, c'est une collision avec l'UUID, ou deviner? En supposant qu'ils sont aléatoires,
source: wikipédia
En résumé,
gen_random_uuid()
est de 128 bits aléatoires stockées dans 128 bits (2**128 combinaisons). 0-déchets.random()
ne génère 52 bits de hasard dans PostgreSQL (2**52 combinaisons).md5()
stockées comme l'UUID est de 128 bits, mais il ne peut être aussi aléatoire que son entrée (52 bits si vous utilisezrandom()
)md5()
stockés en tant que texte est de 288 bits, mais elle 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 de l'aléatoire)md5()
d'un algorithme de hachage, peut être optimisé qu'il n'a pas effectivement faire beaucoup.text
etvarchar
, etc qui stockent comme unvarlena
qui dispose d'une charge pour la longueur de la chaîne.Je jouais avec PostgreSQL récemment, et je crois que j'ai trouvé un peu mieux la solution, en utilisant uniquement intégré dans PostgreSQL méthodes - no pl/pgsql. La seule limitation est qu'il génère actuellement seulement UPCASE chaînes de caractères ou de chiffres, ou de minuscules cordes.
Le second argument de la
generate_series
méthode détermine la longueur de la chaîne.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)), '');
Tout n'est pas actif par défaut, vous pouvez activer l'une des principales extensions:
Ensuite votre déclaration devient un simple appel à gen_salt() qui génère une chaîne de caractères aléatoires:
Le premier numéro est un hachage de l'identificateur. Plusieurs algorithmes sont disponibles, chacun avec leur propre identifiant:
Plus d'informations sur les extensions:
MODIFIER
Comme indiqué par Evan Carrol, comme de v9.4 vous pouvez utiliser
gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
$1$
? C'est un hash de type identificateur (md5==1), le reste est à l'essai à répartition aléatoire de la valeur.Veuillez utiliser
string_agg
!Je suis en utilisant ce avec MD5 pour générer un UUID aussi. Je veux juste une valeur aléatoire avec plus de bits que un
random ()
entier.random()
jusqu'à ce que je obtenir le nombre de bits que je veux. Oh bien.Je ne pense pas que vous êtes à la recherche pour une chaîne de caractères aléatoires en soi. Ce que vous auriez besoin pour la session de vérification est une chaîne qui est garanti pour être unique. Stockez-vous de la session de vérification de l'information pour l'audit? Dans ce cas, vous avez besoin de la chaîne pour être unique entre les sessions. Je connais deux, plutôt approches simples:
Uuid sont garanti être unique, en raison de leur algorithme pour la génération; c'est extrêmement peu probable que vous allez générer deux nombres identiques sur n'importe quel ordinateur, à tout moment, jamais (à noter que c'est beaucoup plus fort que sur des chaînes aléatoires, qui ont une bien plus petite périodicité des Uuid).
Vous devez charger le uuid-ossp extension à utiliser des Uuid. Une fois installé, l'appel de l'uuid_generate_vXXX() les fonctions de votre sélection, d'INSERTION ou de mise à JOUR. L'uuid type est de 16 octets chiffre, mais il a aussi une représentation de chaîne.
select * from md5(to_char(random(), '0.9999999999999999'));
L'ENTIER paramètre définit la longueur de la chaîne. Garantit la couverture de tous les 62 numérique des caractères avec la même probabilité (contrairement à certains autres solutions flottant autour sur l'Internet).
Check out this for a totally different method using gen_random_uuid()
: plus rapide, plus aléatoire, plus efficacement stockées dans la base de données.gen_random_uuid()
est apparue dans la Version 9.4 aussi loin que je peux dire, qui a été publié le 2014-12-18, plus d'un an après la réponse que vous downvoted. Supplémentaires pinaille: la réponse est à seulement 3 1/2 ans 🙂 Mais tu as raison, maintenant que nous avonsgen_random_uuid()
, c'est ce qui doit être utilisé. Donc je vais upvote votre réponse.@Kavius recommandé d'utiliser
pgcrypto
, mais au lieu degen_salt
, qu'en estgen_random_bytes
? Et que diriez -sha512
au lieu demd5
?Docs:
gen_random_uuid()
comme dans ma réponse: plus rapide, plus aléatoire, plus efficacement stockées dans la base de données.