Comment générer une chaîne alphanumérique aléatoire en JavaScript ?
P粉775788723
P粉775788723 2023-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 ?

P粉775788723
P粉775788723

répondre à tous(2)
P粉312195700

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.
P粉985686557

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');

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 :

function randomString(length, chars) {
    var mask = '';
    if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
    if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    if (chars.indexOf('#') > -1) mask += '0123456789';
    if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\';
    var result = '';
    for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
    return result;
}

console.log(randomString(16, 'aA'));
console.log(randomString(32, '#aA'));
console.log(randomString(64, '#A!'));

Fiddle : http://jsfiddle.net/wSQBx/2/

Alternativement, pour utiliser la méthode base36 comme décrit ci-dessous, vous pouvez procéder comme suit :

function randomString(length) {
    return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal