Comment générer une chaîne alphanumérique aléatoire en JavaScript ?
P粉7757887232023-10-12 23:03:12
0
2
750
Quel est le moyen le plus court (dans des limites raisonnables) de générer une chaîne alphanumérique aléatoire (majuscule, minuscule et numérique) à utiliser comme identifiant unique possible en JavaScript ?
Je viens de découvrir que c'est une solution très sympa et élégante :
Math.random().toString(36).slice(2)
Notes sur cette implémentation :
Cela produira une chaîne comprise entre 0 et 12 caractères, généralement 11 caractères, car la stringification à virgule flottante supprime les zéros à droite.
Il ne génère pas de lettres majuscules, seulement des lettres minuscules et des chiffres.
Étant donné que le caractère aléatoire vient de Math.random(), le résultat peut être prévisible et donc pas nécessairement unique.
Même en supposant une implémentation idéale, la sortie aura au plus 52 bits d'entropie, ce qui signifie qu'après avoir généré environ 70 millions de chaînes, vous risquez de vous retrouver avec des doublons.
Si vous souhaitez autoriser uniquement des caractères spécifiques, vous pouvez également procéder ainsi :
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
Je viens de découvrir que c'est une solution très sympa et élégante :
Notes sur cette implémentation :
Math.random()
, le résultat peut être prévisible et donc pas nécessairement unique.Si vous souhaitez autoriser uniquement des caractères spécifiques, vous pouvez également procéder ainsi :
Voici un jsfiddle à démontrer : http://jsfiddle.net/wSQBx/
Une autre approche consiste à utiliser une chaîne spéciale pour indiquer à la fonction quel type de caractères utiliser. Vous pouvez faire ceci :
Fiddle : http://jsfiddle.net/wSQBx/2/
Alternativement, pour utiliser la méthode base36 comme décrit ci-dessous, vous pouvez procéder comme suit :