299 votes

Chaîne alphanumérique aléatoire en JavaScript ?

Quel est le moyen le plus court (dans les limites du raisonnable) de générer une chaîne alphanumérique aléatoire (majuscules, minuscules et chiffres) en JavaScript pour l'utiliser comme identifiant probablement unique ?

29 votes

Le chemin le plus court ? S'agit-il d'une question de golf codé ?

6 votes

Haha, non ! Il ne s'agit pas d'un concours pour savoir qui peut emballer son code le plus serré. J'ai vu des solutions qui listent l'ensemble des caractères dans une chaîne, ce qui semble être du gaspillage. Je cherche juste quelque chose qui ne soit pas beaucoup plus long que nécessaire.

5 votes

@Pavel c'est ce qu'est le code golf....

456voto

JAR.JAR.beans Points 2142

Je viens de découvrir cette solution très agréable et élégante :

Math.random().toString(36).slice(2)

Notes sur cette mise en œuvre :

  • Cela produira une chaîne d'une longueur comprise entre zéro et 12 caractères, généralement 11 caractères, car la stringification en virgule flottante supprime les zéros de fin.
  • Il ne génère pas de lettres majuscules, mais uniquement des lettres minuscules et des chiffres.
  • Parce que le caractère aléatoire vient de Math.random() le résultat peut être prévisible et n'est donc pas nécessairement unique.
  • Même dans l'hypothèse d'une mise en œuvre idéale, la sortie a au maximum 52 bits d'entropie, ce qui signifie que vous pouvez vous attendre à un doublon après environ 70 millions de chaînes générées.

0 votes

Très beau, où l'avez-vous trouvé ?

0 votes

Code interne de l'application, je ne sais pas quelle est l'origine de ce qui était

15 votes

371voto

Nimphious Points 1386

Si vous ne souhaitez autoriser que certains caractères, vous pouvez également procéder de la manière suivante :

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 une démonstration en jsfiddle : http://jsfiddle.net/wSQBx/

Une autre façon de procéder pourrait consister à utiliser une chaîne spéciale indiquant à la fonction les types de caractères à utiliser. Vous pourriez procéder de la manière suivante :

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

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

Pour utiliser la méthode base36 décrite ci-dessous, vous pouvez également procéder de la manière suivante :

function randomString(length) {
    return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}

0 votes

J'aime beaucoup la deuxième approche. J'ai essayé de l'utiliser, et elle semble poser quelques problèmes. Comme vous pouvez le voir dans CECI il génère parfois des chaînes qui n'ont pas la longueur spécifiée. J'ai mis votre randomString(..) dans un for(var i=0;i<50;i++){} qui a généré 50 chaînes de caractères aléatoires, dont la dernière comporte trois caractères. Je lui ai également demandé d'écrire 50 fois dans le document, comme suit : document.write(randomString(8, '#aA!') + "</br>");

1 votes

@Matthew Il se peut que votre navigateur détecte une fausse balise involontaire dans la chaîne de sortie. Vérifiez la source de sortie et voyez s'il n'y a pas quelques < et > qui causent des problèmes.

3 votes

Il y a un problème statistique. Math.round(Math.random() * (chars.length - 1)) donnera la moitié de la probabilité pour [0] et pour [chars.length-1] que pour le reste des caractères, car pour les arrondir il faut respectivement un nombre dans les intervalles [0, 0.5) y [chars.length-2+0.5, chars.length-1) de taille 0.5, tandis que les autres caractères ont besoin de [index-0.5, index+0.5) de taille 1. La fonction d'indexation correcte devrait être : parseInt(Math.random() * chars.length) car la borne supérieure de random() est exclue et chars.length ne sera pas atteint : w3schools.com/jsref/jsref_random.asp

24voto

Josh Mc Points 1408

Ou, pour compléter ce que Jar Jar a suggéré, voici ce que j'ai utilisé dans le cadre d'un projet récent (pour pallier les restrictions de longueur) :

var randomString = function (len, bits)
{
    bits = bits || 36;
    var outStr = "", newStr;
    while (outStr.length < len)
    {
        newStr = Math.random().toString(bits).slice(2);
        outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
    }
    return outStr.toUpperCase();
};

Utiliser :

randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters

9voto

Collin Anderson Points 952

Pour 32 caractères :

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)

7voto

Neal Points 68710

Personnage aléatoire :

String.fromCharCode(i); //where is an int

Int. aléatoire :

Math.floor(Math.random()*100);

Tout est mis bout à bout :

function randomNum(hi){
    return Math.floor(Math.random()*hi);
} 
function randomChar(){
    return String.fromCharCode(randomNum(100));
}
function randomString(length){
   var str = "";
   for(var i = 0; i < length; ++i){
        str += randomChar();
   }
   return str;
}
var RandomString = randomString(32); //32 length string

Violon : http://jsfiddle.net/maniator/QZ9J2/

0 votes

Cela inclut toute une série de caractères non alphanumériques. Un exemple (ce que j'ai obtenu au premier essai) : M&I56aP=H K?<T*, ;0'9_c5Tb

0 votes

J'ai obtenu ] 4INBKJ\`_5.(/"__X,,K"\)] de nombreux caractères ne sont pas utilisables et ont été supprimés par SO

0 votes

Les octets nuls (String.fromCharCode(0)) causent toutes sortes de problèmes dans de nombreux langages/bases de données/environnements. Les codes 33 à 126 produisent les caractères ASCII visibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X