Maison  >  Questions et réponses  >  le corps du texte

Comment générer une chaîne alphanumérique aléatoire en JavaScript ?

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粉775788723P粉775788723373 Il y a quelques jours671

répondre à tous(2)je répondrai

  • P粉312195700

    P粉3121957002023-10-13 12:38:49

    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.

    répondre
    0
  • P粉985686557

    P粉9856865572023-10-13 09:56:40

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

    répondre
    0
  • Annulerrépondre