Maison > Questions et réponses > le corps du texte
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粉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 :
Math.random()
, le résultat peut être prévisible et donc pas nécessairement unique. 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); }