Je génère actuellement une chaîne majuscule pseudo-aléatoire à 8 caractères pour "A" .. "Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
mais il n'a pas l'air propre, et il ne peut pas être passé en argument car il ne s'agit pas d'une seule instruction. Pour obtenir une chaîne à casse mixte "a" .. "z" plus "A" .. "Z", je l'ai modifiée en:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
mais ça ressemble à une poubelle.
Quelqu'un at-il une meilleure méthode?
reset_user_password!(random_string)
oùdef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64
Réponses:
Je passe trop de temps à jouer au golf.
Et un dernier encore plus déroutant, mais plus flexible et qui gaspille moins de cycles:
la source
('a'..'z').to_a.shuffle[0,8].join
. Notez que vous aurez besoin de Ruby> = 1,9 pourshuffle
.SecureRandom
titre d'exemple, dans les autres réponses.[*('a'..'z'),*('0'..'9')].shuffle[0,8].join
pour générer une chaîne aléatoire avec des lettres et des chiffres.rand
est déterministe et prévisible. Ne l'utilisez pas pour générer des mots de passe! UtilisezSecureRandom
plutôt l' une des solutions.Pourquoi ne pas utiliser SecureRandom?
SecureRandom propose également des méthodes pour:
voir: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
la source
require 'securerandom'
obtenir cetSecureRandom
assistant soigné :)SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")
générera une chaîne de 0 à 9a-z (36 caractères) de TOUJOURS 12 caractères. Remplacez 12 par la longueur souhaitée. Malheureusement, aucun moyen d'obtenir simplement AZ en utilisantInteger#to_s
.+fGH1
par une URL, il vous suffit de la coder par URL comme vous le feriez pour TOUTE valeur passant par une URL:%2BfGH1
J'utilise ceci pour générer des chaînes aléatoires adaptées aux URL avec une longueur maximale garantie:
Il génère des chaînes aléatoires d'az minuscule et de 0 à 9. Ce n'est pas très personnalisable mais c'est court et propre.
la source
rand.to_s
; moche, mais fonctionne.length
longueur, environ une fois en ~ 40(36**(length-1) + rand(36**length)).to_s(36)
. 36 ** (longueur-1) converti en base 36 est 10 ** (longueur-1), qui est la plus petite valeur ayant la longueur de chiffres souhaitée.(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
NameError: undefined local variable or method
longueur 'pour main: Object`Cette solution génère une chaîne de caractères facilement lisibles pour les codes d'activation; Je ne voulais pas que les gens confondent 8 avec B, 1 avec I, 0 avec O, L avec 1, etc.
la source
SecureRandom.random_number(charset.size)
place derand(charset.size)
%w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}
et%w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }
(la première liste n'inclut pas les minuscules, mais elle est plus longue) élaboré.D'autres ont mentionné quelque chose de similaire, mais cela utilise la fonction de sécurité des URL.
Le résultat peut contenir AZ, az, 0-9, «-» et «_». "=" Est également utilisé si le remplissage est vrai.
la source
Depuis Ruby 2.5, c'est très simple avec
SecureRandom.alphanumeric
:Il génère des chaînes aléatoires contenant AZ, az et 0-9 et devrait donc être applicable dans la plupart des cas d'utilisation. Et ils sont générés de manière aléatoire et sécurisée, ce qui pourrait également être un avantage.
Il s'agit d'une référence pour la comparer avec la solution ayant le plus de votes positifs:
La
rand
solution ne prend donc qu'environ 3/4 du temps deSecureRandom
. Cela peut avoir de l'importance si vous générez beaucoup de chaînes, mais si vous créez de temps en temps une chaîne aléatoire, j'opterais toujours pour une implémentation plus sécurisée car elle est également plus facile à appeler et plus explicite.la source
Générez une chaîne aléatoire de 8 lettres (par exemple NVAYXHGR)
Génère une chaîne aléatoire de 8 caractères (par exemple 3PH4SWF2), exclut 0/1 / I / O. Ruby 1.9
la source
[*("A".."Z")]'
; ((pas des qoutes simples))stub
çarspec
.Je ne me souviens pas où j'ai trouvé cela, mais cela me semble être le meilleur et le moins intensif pour moi:
la source
0
et1
etO
etI
étaient intentionnellement manquants car ces caractères sont ambigus. Si ce type de code est utilisé pour générer un ensemble de caractères qu'un utilisateur doit copier, il est préférable d'exclure les caractères qui peuvent être difficiles à distinguer hors contexte.la source
Random.new.bytes(9)
n=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
Si vous voulez une chaîne de longueur spécifiée, utilisez:
Il générera une chaîne aléatoire de longueur
2n
contenant0-9
eta-f
la source
n
, il génère en fait une chaîne de 4/3n
..hex
2n. Documentation: SecureRandom.hex génère une chaîne hexadécimale aléatoire. L'argument n spécifie la longueur, en octets, du nombre aléatoire à générer. La longueur de la chaîne hexadécimale résultante est le double de n .Array.new(n){[*"0".."9"].sample}.join
, oùn=8
dans votre cas.Généralisé:,
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
etc.De: " Générer une chaîne pseudo-aléatoire AZ, 0-9 ".
la source
la source
Voici un code simple d'une ligne pour une chaîne aléatoire de longueur 8:
Vous pouvez également l'utiliser pour un mot de passe aléatoire de longueur 8:
la source
P(36, 8) / 36^8 = 0.4
l'espace de caractères possible pour 8 caractères (~ 2x plus facile à la force brute) ouP(36, 25) / 36^25 = 0.00001
l'espace de caractères possible pour 25 caractères (~ 100 000x plus facile à la force brute).Ruby 1.9+:
la source
map
solution est vraiment sympa!#sample
combien d'éléments vous souhaitez. Par exempleALPHABET.sample(10).join
... ruby-doc.org/core-2.4.0/Array.html#method-i-samplesample(10)
vous donne 10 échantillons uniques. Mais vous voulez leur permettre de répéter. Mais j'utiliseraisArray.new(10).map
pour la performanceArray.new
et sa syntaxe de bloc.Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
Attention:
rand
est prévisible pour un attaquant et donc probablement peu sûr. Vous devez absolument utiliser SecureRandom s'il s'agit de générer des mots de passe. J'utilise quelque chose comme ça:la source
Voici un code simple pour un mot de passe aléatoire de longueur 8:
la source
Une autre méthode que j'aime utiliser:
Ajoutez
ljust
si vous êtes vraiment paranoïaque sur la longueur de chaîne correcte:la source
Quelque chose de Devise
la source
.tr('+/=lIO0', 'pqrsxyz')
?Je pense que c'est un bel équilibre entre concision, clarté et facilité de modification.
Facilement modifié
Par exemple, y compris les chiffres:
Hexadécimal majuscule:
Pour un éventail de caractères vraiment impressionnant:
la source
J'ajoute juste mes cents ici ...
la source
rand
Vous pouvez utiliser
String#random
partir des facettes de Ruby Gemfacets
.Il fait essentiellement ceci:
la source
Mon préféré est
(:A..:Z).to_a.shuffle[0,8].join
. Notez que le shuffle nécessite Ruby> 1.9.la source
Cette solution nécessite une dépendance externe, mais semble plus jolie qu'une autre.
Faker::Lorem.characters(10) # => "ang9cbhoa8"
la source
Donné:
Une seule expression, pouvant être passée en argument, autorise les caractères en double:
la source
Je préfère la réponse de Radar, jusqu'à présent, je pense. Je voudrais modifier un peu comme ceci:
la source
(CHARS*length).sample(length).join
?CHARS=['a','b']
alors votre méthode générerait"aa"
ou"bb"
seulement 33% du temps, mais"ab"
ou"ba"
67% du temps. Ce n'est peut-être pas un problème, mais cela vaut la peine de garder à l'esprit!la source
Mes 2 cents:
la source
Je viens d'écrire un petit bijou
random_token
pour générer des jetons aléatoires pour la plupart des cas d'utilisation, profitez de ~https://github.com/sibevin/random_token
la source
2 solutions pour une chaîne aléatoire composée de 3 plages:
Un personnage de chaque plage.
Et si vous avez besoin d'au moins un caractère de chaque plage, comme la création d'un mot de passe aléatoire qui a une majuscule, une lettre minuscule et un chiffre, vous pouvez faire quelque chose comme ceci:
la source
( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
Je faisais quelque chose comme ça récemment pour générer une chaîne aléatoire de 8 octets à partir de 62 caractères. Les caractères étaient 0-9, az, AZ. J'en avais un tableau comme en boucle 8 fois et en choisissant une valeur aléatoire dans le tableau. C'était dans une application Rails.
La chose étrange est que j'ai eu un bon nombre de doublons. Maintenant, au hasard, cela ne devrait pratiquement jamais se produire. 62 ^ 8 est énorme, mais sur 1200 codes environ dans la base de données, j'ai eu un bon nombre de doublons. Je les ai vus se produire aux limites des heures les uns des autres. En d'autres termes, je pourrais voir un double à 12:12:23 et 2:12:22 ou quelque chose comme ça ... je ne sais pas si le temps est le problème ou non.
Ce code était dans la création antérieure d'un objet ActiveRecord. Avant la création de l'enregistrement, ce code s'exécutait et générait le code «unique». Les entrées dans la base de données étaient toujours produites de manière fiable, mais le code (
str
dans la ligne ci-dessus) était dupliqué beaucoup trop souvent.J'ai créé un script pour exécuter 100 000 itérations de cette ligne ci-dessus avec un petit retard, il faudrait donc 3-4 heures en espérant voir une sorte de motif de répétition toutes les heures, mais je n'ai rien vu. Je ne sais pas pourquoi cela se produisait dans mon application Rails.
la source