Je veux une chaîne de 5 caractères composée de caractères choisis au hasard dans l'ensemble [a-zA-Z0-9]
.
Quelle est la meilleure façon de procéder avec JavaScript?
javascript
random
Tom Lehman
la source
la source
true-random
résultat! Ils le sont seulementpseudo-random
. Lorsque vous utilisez des chaînes aléatoires pour la protection ou la sécurité, n'utilisez aucune d'entre elles !!! Essayez l'une de ces API: random.orgMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Réponses:
Je pense que cela fonctionnera pour vous:
la source
+=
de chaînes comme celle-ci entraîne un comportement O (n ^ 2). Si vous souhaitez créer des chaînes plus longues, vous devez créer un tableau de caractères individuels et les réunir à la fin.+=
est souvent plus rapide pour une raison quelconque, même utilisé à l'intérieur des boucles - jsperf.com/join-vs-concatenationcrypto
plutôt.Remarque: l'algorithme ci-dessus présente les faiblesses suivantes:
Math.random()
peut produire une sortie prévisible ("d'aspect aléatoire" mais pas vraiment aléatoire) selon l'implémentation. La chaîne résultante ne convient pas lorsque vous devez garantir l'unicité ou l'imprévisibilité.la source
Math.random().toString(36).substr(2, 5)
, car.substring(7)
elle fait plus de 5 caractères. Plein de points, quand même!toString
méthode d'un type de nombre en javascript prend un paramètre facultatif pour convertir le nombre en une base donnée. Si vous passez deux, par exemple, vous verrez votre nombre représenté en binaire. Semblable à hex (base 16), la base 36 utilise des lettres pour représenter les chiffres au-delà de 9. En convertissant un nombre aléatoire en base 36, vous vous retrouverez avec un tas de lettres et de chiffres apparemment aléatoires.(Math.random() + 1).toString(36).substring(7);
Math.random est mauvais pour ce genre de chose
Option 1
Si vous êtes en mesure de le faire côté serveur , utilisez simplement le module crypto -
La chaîne résultante sera deux fois plus longue que les octets aléatoires que vous générez; chaque octet codé en hexadécimal est de 2 caractères. 20 octets correspondront à 40 caractères hexadécimaux.
Option 2
Si vous devez faire cela côté client , essayez peut-être le module uuid -
Option 3
Si vous devez le faire côté client et que vous n'avez pas à prendre en charge les anciens navigateurs, vous pouvez le faire sans dépendances -
Pour plus d'informations sur
crypto.getRandomValues
-Voici un petit exemple de console -
Pour le support IE11, vous pouvez utiliser -
Pour la couverture du navigateur, voir https://caniuse.com/#feat=getrandomvalues
la source
.map()
option 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Merci de m'avoir présenté ces fonctionnalités :-)require
module n'est-il pas uniquement utilisable côté serveur?Court, facile et fiable
Renvoie exactement 5 caractères aléatoires, contrairement à certaines des meilleures réponses trouvées ici.
la source
Math.random().toString(36)
renvoie un nombre de moins de 5 caractères?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Voici une amélioration de l'excellente réponse de doubletap . L'original présente deux inconvénients qui sont abordés ici:
Tout d'abord, comme d'autres l'ont mentionné, il a une faible probabilité de produire des chaînes courtes ou même une chaîne vide (si le nombre aléatoire est 0), ce qui peut casser votre application. Voici une solution:
Deuxièmement, l'original et la solution ci-dessus limitent la taille de chaîne N à 16 caractères. Ce qui suit renverra une chaîne de taille N pour tout N (mais notez que l'utilisation de N> 16 n'augmentera pas le caractère aléatoire ou ne diminuera pas la probabilité de collisions):
Explication:
Réflexions supplémentaires:
Mise à jour:
Voici quelques autres monoplaces de style fonctionnel que j'ai imaginées. Ils diffèrent de la solution ci-dessus en ce que:
Donc, disons que votre alphabet de choix est
Ensuite, ces deux sont équivalents, vous pouvez donc choisir celui qui vous convient le mieux:
et
Éditer:
Il me semble que Qubyte et Martijn de Milliano ont trouvé des solutions similaires à celles-ci (bravo!), Que j'ai en quelque sorte ratées. Comme ils ne sont pas aussi courts en un coup d'œil, je vais le laisser ici de toute façon au cas où quelqu'un voudrait vraiment un one-liner :-)
En outre, remplacé «nouveau tableau» par «tableau» dans toutes les solutions pour raser quelques octets de plus.
la source
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
donne un résultat attendu qui ressemble plus à.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
La solution la plus compacte, car
slice
est plus courte quesubstring
. La soustraction de la fin de la chaîne permet d'éviter le symbole à virgule flottante généré par larandom
fonction:ou même
Mise à jour: Ajout d'une approche supplémentaire à l'aide de la
btoa
méthode:la source
Math.random().toString(36).slice(-5);
- Et siMath.random()
revient0.0
?"0"
;)Math.random()
renvoie0.5
le résultat est"0.i"
. Je ne sais pas s'il y a d'autres cas de bord. Je voulais juste souligner que ce n'est pas une bonne réponse à la question (5 caractères de [a-zA-Z0-9]).(+new Date + Math.random())
pour éviter ce cas. Quoi qu'il en soit, merci pour la note.Quelque chose comme ça devrait fonctionner
Appelez avec le jeu de caractères par défaut [a-zA-Z0-9] ou envoyez le vôtre:
la source
len
directement dans unewhile
boucleUne version plus récente avec l' opérateur de diffusion es6 :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
nombre est arbitraire, vous pouvez choisir la longueur de jeton que vous souhaitez36
est le numéro de radix maximum vous pouvez passer à numeric.toString () , ce qui signifie que tous les nombres et les lettres minuscules az2
est utilisé pour choisir le 3ème index de la chaîne aléatoire qui ressemble à ceci:,"0.mfbiohx64i"
nous pourrions prendre n'importe quel index après0.
la source
la source
while(s.length< L) s+= randomchar();
while(L--)
fera également'A'.charCodeAt(0)
que le nombre magique55
(et de même pour le61
). D'autant plus que, sur ma plateforme en tout cas, le nombre magique qui revient est65
. Ce code se documentera également mieux.Générateur de chaînes aléatoires (alpha-numérique | alpha | numérique)
Bien que ce qui précède utilise des vérifications supplémentaires pour la sortie A / N, A, N souhaitée , décomposons-la par l'essentiel (alpha-numérique uniquement) pour une meilleure compréhension:
var str = "";
pour concaténer des caractères aléatoiresrand
numéro d'index de 0 à 61 (0..9 + A..Z + a..z = 62)rand
(car c'est 0..61) en l'incrémentant d'un certain nombre (voir les exemples ci-dessous) pour récupérer le bonCharCode
nombre et le caractère associé.str
unString.fromCharCode( incremented rand )
Imaginons les plages de la table de caractères ASCII :
Math.floor( Math.random * 62 )
donne une gamme de0..61
(ce dont nous avons besoin). Corrigeonsl'aléatoire pour obtenir les plages charCode correctes :
La logique d' opération conditionnelle du tableau ci-dessus:
À partir de l'explication ci-dessus, voici l' extrait alpha-numérique résultant :
Ou si vous voulez:
la source
La manière la plus simple est:
Cela génère des chaînes aléatoires de 5 caractères en fonction de l'heure actuelle. L'exemple de sortie est
4mtxj
ou4mv90
ou4mwp1
Le problème avec cela est que si vous l'appelez deux fois sur la même seconde, il générera la même chaîne.
La manière la plus sûre est:
Cela générera une chaîne aléatoire de 4 ou 5 caractères, toujours différents. L'exemple de sortie est comme
30jzm
ou1r591
ou4su1a
Dans les deux cas, la première partie génère un nombre aléatoire. La
.toString(36)
pièce a converti le nombre en une représentation base36 (alphadécimale) de celui-ci.la source
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
pour la couvrir.(Math.random()*1e20).toString(36)
.Voici quelques doublures simples. Modifiez
new Array(5)
pour définir la longueur.Comprenant
0-9a-z
Comprenant
0-9a-zA-Z
la source
Je sais que tout le monde a déjà raison, mais j'avais envie d'essayer celui-ci de la manière la plus légère possible (lumière sur le code, pas sur le CPU):
Cela prend un peu de temps pour envelopper votre tête, mais je pense que cela montre vraiment à quel point la syntaxe de javascript est géniale.
la source
current = current ? current : '';
quand vous pouvez écrirecurrent = current || ''
;current || (current = '');
Si vous utilisez Lodash ou Underscore , alors c'est si simple:
la source
_.sampleSize('asdfgh',5).join('')
Pour répondre à l'exigence [a-zA-Z0-9] et à la longueur = 5, utilisez
Des lettres minuscules, des lettres majuscules et des chiffres apparaîtront.
la source
Dans le cas où quelqu'un est intéressé par une ligne unique (bien que non formatée comme telle pour votre commodité) qui alloue la mémoire à la fois (mais notez que pour les petites chaînes, cela n'a vraiment pas d'importance), voici comment le faire:
Vous pouvez remplacer
5
par la longueur de la chaîne souhaitée. Merci à @AriyaHidayat dans ce post pour la solution à lamap
fonction ne fonctionnant pas sur le tableau clairsemé créé parArray(5)
.la source
Voici la méthode que j'ai créée.
Il créera une chaîne contenant à la fois des majuscules et des minuscules.
De plus, j'ai inclus la fonction qui créera également une chaîne alphanumérique.
Exemples pratiques:
http://jsfiddle.net/greatbigmassive/vhsxs/ (alpha uniquement)
http://jsfiddle.net/greatbigmassive/PJwg8/ (alphanumérique)
Mise à niveau juillet 2015
Cela fait la même chose mais est plus logique et inclut toutes les lettres.
la source
En supposant que vous utilisez underscorejs, il est possible de générer élégamment une chaîne aléatoire en seulement deux lignes:
la source
la source
Algorithme rapide et amélioré. Ne garantit pas l'uniformité (voir commentaires).
la source
crypto.getRandomValues
renvoie l'une des 256 valeurs uniques. Parce que 256 n'est pas divisé par 62, vous finissez par avoir une probabilité légèrement plus élevée d'obtenir les caractères AH. Je pense que la meilleure solution est de faire ce que YouTube a fait, et d'ajouter simplement 2 caractères supplémentaires (éventuellement-
et_
) au jeu de caractères. Quoi qu'il en soit, excellent travail - cette réponse a besoin de beaucoup plus d'amour :)Le problème avec les réponses aux questions "J'ai besoin de chaînes aléatoires" (dans n'importe quelle langue) est que pratiquement chaque solution utilise une spécification primaire erronée de longueur de chaîne . Les questions elles-mêmes révèlent rarement pourquoi les chaînes aléatoires sont nécessaires, mais je vous mets au défi de rarement avoir besoin de chaînes aléatoires de longueur, disons 8. Ce dont vous avez invariablement besoin, c'est d'un certain nombre de chaînes uniques , par exemple, à utiliser comme identificateurs dans un certain but.
Il existe deux façons principales d'obtenir des chaînes strictement uniques : de manière déterministe (qui n'est pas aléatoire) et de stocker / comparer (ce qui est onéreux). Qu'est-ce qu'on fait? Nous abandonnons le fantôme. Nous optons plutôt pour l' unicité probabiliste . Autrement dit, nous acceptons qu'il existe un risque (aussi faible soit-il) que nos cordes ne soient pas uniques. C'est là que la compréhension de la probabilité de collision et de l' entropie est utile.
Je vais donc reformuler le besoin invariable comme nécessitant un certain nombre de chaînes avec un petit risque de répétition. À titre d'exemple concret, supposons que vous souhaitiez générer un potentiel de 5 millions d'ID. Vous ne voulez pas stocker et comparer chaque nouvelle chaîne et vous voulez qu'elles soient aléatoires, vous acceptez donc un risque de répétition. Par exemple, supposons un risque de moins de 1 sur mille milliards de chances de répétition. Alors, quelle longueur de chaîne avez-vous besoin? Eh bien, cette question est sous-spécifiée car elle dépend des caractères utilisés. Mais plus important encore, c'est erroné. Ce dont vous avez besoin est une spécification de l'entropie des cordes, pas de leur longueur. L'entropie peut être directement liée à la probabilité de répétition d'un certain nombre de chaînes. La longueur de chaîne ne peut pas.
Et c'est là qu'une bibliothèque comme EntropyString peut vous aider. Pour générer des ID aléatoires qui ont moins de 1 chance sur 1 000 milliards de répétitions dans 5 millions de chaînes en utilisant
entropy-string
:entropy-string
utilise un jeu de caractères avec 32 caractères par défaut. Il existe d'autres jeux de caractères prédéfinis et vous pouvez également spécifier vos propres caractères. Par exemple, générer des ID avec la même entropie que ci-dessus mais en utilisant des caractères hexadécimaux:Notez la différence de longueur de chaîne en raison de la différence du nombre total de caractères dans le jeu de caractères utilisé. Le risque de répétition dans le nombre spécifié de chaînes potentielles est le même. Les longueurs de chaîne ne le sont pas. Et surtout, le risque de répétition et le nombre potentiel de chaînes est explicite. Plus besoin de deviner avec la longueur de la chaîne.
la source
C'est aussi propre que possible. C'est aussi rapide, http://jsperf.com/ay-random-string .
la source
strLength - 1
: - /--strLength
àstrLength--
fixe pour moi.Vous pouvez parcourir un tableau d'éléments et les ajouter récursivement à une variable de chaîne, par exemple si vous vouliez une séquence d'ADN aléatoire:
la source
Je n'ai pas trouvé de solution propre pour prendre en charge les caractères minuscules et majuscules.
Prise en charge des minuscules uniquement:
Math.random().toString(36).substr(2, 5)
S'appuyant sur cette solution pour prendre en charge les minuscules et les majuscules:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Modifiez le
5
danssubstr(2, 5)
pour ajuster à la longueur dont vous avez besoin.la source
Bon mot:
la source
Array(15)
une valeur plus petite. Par exemple:Array(4)
.Cela fonctionne à coup sûr
la source
Que diriez-vous de quelque chose comme ça:
Date.now().toString(36)
Pas très aléatoire, mais court et assez unique à chaque fois que vous l'appelez.la source
Date.now()
il n'a qu'une résolution en millisecondes. Lorsqu'il est exécuté dans une boucle simple, par exemple, vous obtiendrez de nombreux doublons.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.Caractères alphanumériques insensibles à la casse:
L'avantage de cette fonction est que vous pouvez obtenir une chaîne aléatoire de longueur différente et qu'elle garantit la longueur de la chaîne.
Respecter la casse tous les caractères:
Caractères personnalisés
la source
var possible
like dans la réponse acceptée, donc le résultat de la fonction est plus configurable.Générez une chaîne de 10 caractères. La longueur est définie par paramètre (10 par défaut).
la source
Vous pouvez utiliser coderain . C'est une bibliothèque pour générer des codes aléatoires selon un modèle donné. Utilisez
#
comme espace réservé pour les caractères majuscules et minuscules ainsi que pour les chiffres:Il existe d'autres espaces réservés comme
A
pour les lettres majuscules ou9
pour les chiffres.Ce qui peut être utile, c'est que l'appel
.next()
vous donnera toujours un résultat unique afin que vous n'ayez pas à vous soucier des doublons.Voici une application de démonstration qui génère une liste de codes aléatoires uniques .
Divulgation complète: je suis l'auteur de coderain.
la source