Générer des chaînes/caractères aléatoires en JavaScript

je veux une chaîne de 5 caractères composée de caractères choisis au hasard dans l'ensemble [a-zA-Z0-9] .

Quelle est la meilleure façon de faire cela avec JavaScript?

1210
demandé sur T.Todua 2009-08-29 01:14:41

30 réponses

je pense que ça va marcher pour vous:

function makeid() {
  var text = "";
  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

  for (var i = 0; i < 5; i++)
    text += possible.charAt(Math.floor(Math.random() * possible.length));

  return text;
}

console.log(makeid());
1704
répondu csharptest.net 2017-06-29 10:24:37

let r = Math.random().toString(36).substring(7);
console.log("random", r);
1796
répondu doubletap 2018-08-25 17:24:17

"151950920 des Mathématiques".au hasard est mauvais pour ce genre de chose

Option 1

si vous êtes en mesure de faire ce serveur - côté, il suffit d'utiliser le crypto module

var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');

// "bb5dc8842ca31d4603d6aa11448d1654"

la chaîne résultante sera deux fois plus longue que les octets aléatoires que vous générez; chaque octet encodé à hex est de 2 caractères. 20 octets seront 40 les caractères de l'hexagone.


Option 2

si vous devez faire ce client - côté, peut-être essayer le module uuid

var uuid = require("uuid");
var id = uuid.v4();

// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"

Option 3

si vous devez faire ce client -côté et vous ne devez pas prendre en charge d'anciens navigateurs, vous pouvez le faire sans dépendances

// dec2hex :: Integer -> String
function dec2hex (dec) {
  return ('0' + dec.toString(16)).substr(-2)
}

// generateId :: Integer -> String
function generateId (len) {
  var arr = new Uint8Array((len || 40) / 2)
  window.crypto.getRandomValues(arr)
  return Array.from(arr, dec2hex).join('')
}

console.log(generateId())
// "82defcf324571e70b0521d79cce2bf3fffccd69"

console.log(generateId(20))
// "c1a050a4cd1556948d41"
260
répondu user633183 2017-05-23 12:34:53

voici une amélioration par rapport à l'excellente réponse de doubletap . L'original a deux inconvénients qui sont abordés ici:

tout d'abord, comme d'autres l'ont mentionné, il a une faible probabilité de produire des chaînes courtes ou même une chaîne vide (si le nombre aléatoire est 0), ce qui peut briser votre application. Voici une solution:

(Math.random().toString(36)+'00000000000000000').slice(2, N+2)

Deuxièmement, l'original et la solution au-dessus limitent la taille de la chaîne N à 16 caractère. La chaîne suivante retournera une chaîne de taille N pour n'importe quel N (mais notez que L'utilisation de N > 16 n'augmentera pas le caractère aléatoire ou ne diminuera pas la probabilité de collisions):

Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)

explication:

  1. Choisir un nombre aléatoire dans l'intervalle [0,1), c'est à dire entre 0 (inclus) et 1 (exclus).
  2. convertissez le nombre en chaîne de base-36, c'est-à-dire en utilisant les caractères 0-9 et A-Z.
  3. Pad avec les zéros (résout le premier problème).
  4. Coupe L'avant 0."préfixe et zéros de remplissage supplémentaires.
  5. répétez la chaîne suffisamment de fois pour avoir au moins N caractères (en joignant les chaînes vides avec la chaîne aléatoire plus courte utilisée comme délimiteur).
  6. tranche exactement N caractères de la chaîne.

autres réflexions:

  • Cette solution n'utilise pas majuscules, mais dans presque tous les cas (aucun calembour prévu) il n'a pas d'importance.
  • la longueur maximale de la chaîne à N = 16 dans la réponse originale est mesurée en Chrome. Dans Firefox, c'est N = 11. Mais comme expliqué, la seconde solution est de supporter n'importe quelle longueur de chaîne demandée, pas d'ajouter de l'aléatoire, donc cela ne fait pas beaucoup de différence.
  • toutes les chaînes retournées ont une probabilité égale d'être retournées, au moins en ce qui concerne les résultats retourné par les Mathématiques.random () sont également distribués (ce n'est pas cryptographique-force aléatoire, dans tous les cas).
  • toutes les chaînes possibles de taille N ne peuvent pas être retournées. Dans la deuxième solution, ceci est évident (puisque la chaîne plus petite est simplement dupliquée), mais aussi dans la réponse originale ceci est vrai puisque dans la conversion en base-36 Les derniers bits peuvent ne pas faire partie des bits aléatoires originaux. Plus précisément, si vous regardez le résultat des Mathématiques.aléatoire.)(toString (36), vous remarquerez que le dernier caractère n'est pas réparti uniformément. Encore une fois, dans presque tous les cas, cela n'a pas d'importance, mais nous coupons la chaîne finale du début plutôt que la fin de la chaîne aléatoire de sorte que les chaînes courtes (par exemple N=1) ne sont pas affectées.

mise à jour:

voici quelques autres doublures de style fonctionnel que j'ai inventé. Ils diffèrent de la solution ci-dessus en ce que:

  • ils utilisent un alphabet arbitraire explicite (plus générique, et adapté à la question originale qui demandait à la fois des majuscules et des minuscules).
  • toutes les chaînes de longueur N ont une probabilité égale d'être retournées (c'est-à-dire que les chaînes ne contiennent pas de répétitions).
  • ils sont basés sur une fonction de carte, plutôt que le tour toString(36), ce qui les rend plus simple et facile à comprendre.

Donc, disons que votre alphabet de choix est

var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

alors ces deux-là sont équivalents l'un à l'autre, de sorte que vous pouvez choisir celui qui est le plus intuitif pour vous:

Array(N).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

et

Array.apply(null, Array(N)).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

Edit:

je semble qubyte et Martijn de Milliano est venu avec des solutions similaires à celui-ci (bravo!), j'ai en quelque sorte manquée. Puisqu'ils n'ont pas l'air aussi courts en un coup d'oeil, je vais le laisser ici de toute façon au cas où quelqu'un voudrait vraiment un one-liner: -)

a également remplacé "new Array" par "Array" dans toutes les solutions pour supprimer quelques octets supplémentaires.

134
répondu amichair 2017-05-23 12:02:58

court, facile et fiable

renvoie exactement 5 caractères aléatoires, par opposition à certaines des réponses les mieux cotées trouvées ici.

Math.random().toString(36).substr(2, 5);
132
répondu Silver Ringvee 2017-12-12 10:23:05

quelque chose comme ça devrait marcher

function randomString(len, charSet) {
    charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var randomString = '';
    for (var i = 0; i < len; i++) {
        var randomPoz = Math.floor(Math.random() * charSet.length);
        randomString += charSet.substring(randomPoz,randomPoz+1);
    }
    return randomString;
}

l'Appel avec le jeu de caractères par défaut ([a-zA-Z0-9] ou de l'envoyer dans votre propre:

var randomValue = randomString(5);

var randomValue = randomString(5, 'PICKCHARSFROMTHISSET');
83
répondu CaffGeek 2009-08-28 21:28:20

function randomstring(L) {
  var s = '';
  var randomchar = function() {
    var n = Math.floor(Math.random() * 62);
    if (n < 10) return n; //1-10
    if (n < 36) return String.fromCharCode(n + 55); //A-Z
    return String.fromCharCode(n + 61); //a-z
  }
  while (s.length < L) s += randomchar();
  return s;
}
console.log(randomstring(5));
61
répondu kennebec 2017-06-29 10:17:53

la solution la plus compacte, car slice est plus court que substring . La soustraction de la fin de la chaîne permet d'éviter le symbole à virgule flottante généré par random fonction:

Math.random().toString(36).slice(-5);

ou même

(+new Date).toString(36).slice(-5);

// Using Math.random
console.log(Math.random().toString(36).slice(-5));

// Using new Date
console.log((+new Date).toString(36).slice(-5));
52
répondu Valentin 2018-01-21 01:52:18

Générateur De Chaîne Aléatoire (Alpha-Numérique | Alpha / Numérique)

/**
 * RANDOM STRING GENERATOR
 *
 * Info:      http://stackoverflow.com/a/27872144/383904
 * Use:       randomString(length [,"A"] [,"N"] );
 * Default:   return a random alpha-numeric string
 * Arguments: If you use the optional "A", "N" flags:
 *            "A" (Alpha flag)   return random a-Z string
 *            "N" (Numeric flag) return random 0-9 string
 */
function randomString(len, an){
    an = an&&an.toLowerCase();
    var str="", i=0, min=an=="a"?10:0, max=an=="n"?10:62;
    for(;i++<len;){
      var r = Math.random()*(max-min)+min <<0;
      str += String.fromCharCode(r+=r>9?r<36?55:61:48);
    }
    return str;
}
randomString(10);        // "4Z8iNQag9v"
randomString(10, "A");   // "aUkZuHNcWw"
randomString(10, "N");   // "9055739230"

amusez-vous bien. jsBin démo


alors que ce qui précède utilise des contrôles supplémentaires pour la sortie désirée (A/N, A, N) , décomposons l'essentiel (alphanumérique seulement) pour une meilleure compréhension:

  • créer une fonction qui accepte un argument (longueur désirée du résultat de la chaîne aléatoire)
  • créer une chaîne vide comme var str = ""; pour concaténer des caractères aléatoires
  • à l'Intérieur d'une boucle créer un rand numéro d'index à partir de 0 à 61 (0..9 + A..Z+un..z = 62)
  • créer un logique conditionnelle pour Adjust / fix rand (puisqu'il est 0..61) l'incrémenter d'un certain nombre (voir les exemples ci-dessous) pour obtenir le nombre droit CharCode et le caractère connexe.
  • à l'Intérieur de la boucle de concaténer str un String.fromCharCode( incremented rand )

imaginons la table de caractères et leurs fourchettes :

_____0....9______A..........Z______a..........z___________  Character
     | 10 |      |    26    |      |    26    |             Tot = 62 characters
    48....57    65..........90    97..........122           CharCode ranges

Math.floor( Math.random * 62 ) donne une gamme de 0..61 (ce dont nous avons besoin). Comment régler (incrément) de l'aléatoire pour obtenir le charCode des plages ?

      |   rand   | charCode |  (0..61)rand += fix            = charCode ranges |
------+----------+----------+--------------------------------+-----------------+
0..9  |   0..9   |  48..57  |  rand += 48                    =     48..57      |
A..Z  |  10..35  |  65..90  |  rand += 55 /*  90-35 = 55 */  =     65..90      |
a..z  |  36..61  |  97..122 |  rand += 61 /* 122-61 = 61 */  =     97..122     |

Le conditionnel de l'opération logique à partir de la table ci-dessus:

   rand += rand>9 ? ( rand<36 ? 55 : 61 ) : 48 ;
// rand +=  true  ? (  true   ? 55 else 61 ) else 48 ;

si vous avez suivi l'explication ci-dessus, vous devriez être en mesure de créer ce snippet alphanumérique :

démo de jsBin

function randomString( len ) {
  var str = "";                                         // String result
  for(var i=0; i<len; i++){                             // Loop `len` times
    var rand = Math.floor( Math.random() * 62 );        // random: 0..61
    var charCode = rand+= rand>9? (rand<36?55:61) : 48; // Get correct charCode
    str += String.fromCharCode( charCode );             // add Character to str
  }
  return str;       // After all loops are done, return the concatenated string
}

console.log( randomString(10) ); // "7GL9F0ne6t"

ou si vous voulez:

function randomString( n ) {
  var r="";
  while(n--)r+=String.fromCharCode((r=Math.random()*62|0,r+=r>9?(r<36?55:61):48));
  return r;
}
41
répondu Roko C. Buljan 2016-01-07 17:49:38

la manière la plus simple est:

(new Date%9e6).toString(36)

génère des chaînes aléatoires de 5 caractères basées sur l'heure actuelle. Exemple de sortie: 4mtxj ou 4mv90 ou 4mwp1

Le problème avec cela est que si vous l'appelez deux fois sur la même seconde, il va générer la même chaîne.

la manière la plus sûre est:

(0|Math.random()*9e6).toString(36)

cela générera une chaîne aléatoire de 4 ou 5 des personnages, toujours différents. Exemple de sortie est comme 30jzm ou 1r591 ou 4su1a

dans les deux sens, la première partie génère un nombre aléatoire. La partie .toString(36) donne le nombre à une représentation de base36 (alphadécimale) de celui-ci.

28
répondu MasqueradeCircus 2015-03-11 22:19:43

une nouvelle version avec es6 151990920 "spread operator :

[...Array(30)].map(() => Math.random().toString(36)[3]).join('')

  • le 30 est un nombre arbitraire, vous pouvez choisir la longueur de jeton que vous voulez
  • le 36 est le nombre radix maximum que vous pouvez passer à numérique.toString () , qui signifie Tous les nombres et a-z lettres minuscules
  • le 3 est utilisé pour choisir le 3ème numéro de la chaîne aléatoire qui ressemble à ceci: "0.mfbiohx64i" , nous pourrions prendre n'importe quel indice après 0.
26
répondu Or Duan 2018-02-18 01:04:10

Voici des doublures simples. Changez new Array(5) pour régler la longueur.

y compris 0-9a-z

new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36);})

y compris 0-9a-zA-Z

new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36)[Math.random()<.5?"toString":"toUpperCase"]();});
18
répondu bendytree 2015-10-26 14:57:31

si vous utilisez Lodash ou Underscore , alors il est si simple:

var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');
14
répondu vineet 2016-04-20 05:39:18

je sais que tout le monde a déjà fait ce qu'il fallait, mais j'ai eu envie d'essayer celui-ci de la manière la plus légère possible(light on code, pas CPU):

function rand(length, current) {
  current = current ? current : '';
  return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
}

console.log(rand(5));

il faut un peu de temps pour envelopper votre tête autour, mais je pense qu'il montre vraiment comment la syntaxe JavaScript génial est.

14
répondu Roderick 2017-06-29 11:08:40

en supposant que vous utilisez sous-titres il est possible de générer élégamment une chaîne aléatoire en seulement deux lignes:

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');
11
répondu tiktak 2015-05-18 11:48:25

Voici la méthode que j'ai créée.

Il créera une chaîne contenant à la fois des caractères majuscules et minuscules.

En outre, je ai inclus la fonction qui créé une chaîne alphanumérique.

exemples de travail:

http://jsfiddle.net/greatbigmassive/vhsxs/ (alpha seulement)

http://jsfiddle.net/greatbigmassive/PJwg8 / (alphanumérique)

function randString(x){
    var s = "";
    while(s.length<x&&x>0){
        var r = Math.random();
        s+= String.fromCharCode(Math.floor(r*26) + (r>0.5?97:65));
    }
    return s;
}

Mise À Jour En Juillet 2015

Cela fait la même chose mais fait plus de sens et inclut toutes les lettres.

var s = "";
while(s.length<x&&x>0){
    v = Math.random()<0.5?32:0;
    s += String.fromCharCode(Math.round(Math.random()*((122-v)-(97-v))+(97-v)));
}
11
répondu Adam 2015-07-27 11:54:09

dans le cas où n'importe qui est intéressé par un one-liner (bien que pas formaté en tant que tel pour votre convenance) qui alloue la mémoire à la fois (mais notez que pour les petites chaînes, il n'a vraiment pas d'importance) voici comment le faire:

Array.apply(0, Array(5)).map(function() {
    return (function(charset){
        return charset.charAt(Math.floor(Math.random() * charset.length))
    }('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
}).join('')

Vous pouvez remplacer 5 par la longueur de la chaîne que vous souhaitez. Merci à @AriyaHidayat dans ce post pour la solution à la fonction map ne fonctionne pas sur le réseau clairsemé créé par Array(5) .

10
répondu Martijn de Milliano 2017-05-23 12:02:58

pour répondre À l'exigence [a-zA-Z0-9] et la longueur=5

btoa(Math.random()).substr(5, 5);

lettres minuscules, lettres majuscules, et les nombres se produiront.

8
répondu Sergio Cabral 2018-06-18 01:50:21

algorithme rapide et amélioré. Ne garantit pas l'uniforme (voir commentaires).

function getRandomId(length) {
    if (!length) {
        return '';
    }

    const possible =
        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let result = '';
    let array;

    if ('Uint8Array' in self && 'crypto' in self && length <= 65536) {
        array = new Uint8Array(length);
        self.crypto.getRandomValues(array);
    } else {
        array = new Array(length);

        for (let i = 0; i < length; i++) {
            array[i] = Math.floor(Math.random() * 62);
        }
    }

    for (let i = 0; i < length; i++) {
        result += possible.charAt(array[i] % 62);
    }

    return result;
}
7
répondu yaroslav 2017-05-21 10:33:45
function randomString (strLength, charSet) {
    var result = [];

    strLength = strLength || 5;
    charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    while (--strLength) {
        result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));
    }

    return result.join('');
}

c'est aussi propre que possible. Il est rapide aussi, http://jsperf.com/ay-random-string .

5
répondu Gajus 2013-01-10 02:07:23

vous pouvez boucler un tableau d'éléments et les ajouter récursivement à une variable string, par exemple si vous voulez une séquence d'ADN aléatoire:

function randomDNA(len) {
  len = len || 100
  var nuc = new Array("A", "T", "C", "G")
  var i = 0
  var n = 0
  s = ''
  while (i <= len - 1) {
    n = Math.floor(Math.random() * 4)
    s += nuc[n]
    i++
  }
  return s
}

console.log(randomDNA(5));
5
répondu Andy 2017-06-29 10:31:37

Je n'ai pas trouvé de solution propre pour supporter à la fois les caractères minuscules et les majuscules.

support en minuscules seulement:

Math.random().toString(36).substr(2, 5)

en S'appuyant sur cette solution pour supporter les minuscules et les majuscules:

Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');

changez le 5 dans substr(2, 5) pour vous ajuster à la longueur dont vous avez besoin.

5
répondu ravishi 2018-02-05 21:17:16

Que Diriez-vous de quelque chose comme ceci: Date.now().toString(36) Pas très aléatoire, mais court et assez unique à chaque fois que vous l'appelez.

4
répondu Swergas 2017-11-16 14:21:11

Cela fonctionne pour vous

<script language="javascript" type="text/javascript">
function randomString() {
 var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
 var string_length = 8;
 var randomstring = '';
 for (var i=0; i<string_length; i++) {
  var rnum = Math.floor(Math.random() * chars.length);
  randomstring += chars.substring(rnum,rnum+1);
 }
 document.randform.randomfield.value = randomstring;
}
</script>
3
répondu Vignesh 2009-12-03 08:48:06

génère une chaîne de 10 caractères. La longueur est définie par le paramètre (par défaut 10).

function random_string_generator(len) {
var len = len || 10;
var str = '';
var i = 0;

for(i=0; i<len; i++) {
    switch(Math.floor(Math.random()*3+1)) {
        case 1: // digit
            str += (Math.floor(Math.random()*9)).toString();
        break;

        case 2: // small letter
            str += String.fromCharCode(Math.floor(Math.random()*26) + 97); //'a'.charCodeAt(0));
        break;

        case 3: // big letter
            str += String.fromCharCode(Math.floor(Math.random()*26) + 65); //'A'.charCodeAt(0));
        break;

        default:
        break;
    }
}
return str;
}
3
répondu ropsiU 2013-01-11 11:00:36

voici un script de test pour la réponse #1 (Merci @csharptest.net)

le script exécute makeid() 1 million fois et comme vous pouvez le voir 5 n'est pas un très unique. le lancer avec une longueur de char de 10 est assez fiable. Je l'ai fait environ 50 fois et n'ai pas encore vu de duplicata :-)

note: la limite de taille de la pile de noeuds dépasse environ 4 millions de sorte que vous ne pouvez pas exécuter ces 5 millions de fois qu'il ne sera jamais fini.

function makeid()
{
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for( var i=0; i < 5; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

ids ={}
count = 0
for (var i = 0; i < 1000000; i++) {
    tempId = makeid();
    if (typeof ids[tempId] !== 'undefined') {
        ids[tempId]++;
        if (ids[tempId] === 2) {
            count ++;
        }
        count++;
    }else{
        ids[tempId] = 1;
    }
}
console.log("there are "+count+ ' duplicate ids');
3
répondu James Harrington 2014-08-07 02:08:55

vous pouvez utiliser coderain . C'est une bibliothèque pour générer des codes aléatoires selon le modèle donné. Utilisez # comme un espace réservé pour les caractères majuscules et minuscules ainsi que les chiffres:

var cr = new CodeRain("#####");
console.log(cr.next());

il y a d'autres espaces réservés comme A pour les lettres majuscules ou 9 pour les chiffres.

ce qui peut être utile est que l'appel .next() vous donnera toujours un résultat unique afin que vous n'ayez pas à s'inquiéter des doublons.

Voici une application de démonstration que génère une liste de codes aléatoires uniques .

divulgation Complète: je suis l'auteur de coderain.

3
répondu Lukasz Wiktor 2017-01-09 14:54:21

et ce petit truc compact?

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var stringLength = 5;

function pickRandom() {
    return possible[Math.floor(Math.random() * possible.length)];
}

var randomString = Array.apply(null, Array(stringLength)).map(pickRandom).join('');

vous avez besoin du Array.apply là pour piéger le tableau vide en étant un tableau d'undefineds.

si vous codez pour ES2015, alors construire le tableau est un peu plus simple:

var randomString = Array.from({ length: stringLength }, pickRandom).join('');
3
répondu qubyte 2017-05-03 09:32:25

Le problème avec les réponses à "j'ai besoin de chaînes aléatoires" questions (quelle que soit la langue) est pratiquement chaque solution utilise une mauvaise spécification primaire de longueur de la chaîne . Les questions elles-mêmes rarement révéler pourquoi les chaînes aléatoires sont nécessaires, mais je vous aurez rarement besoin de chaînes aléatoires de longueur, disons 8. Ce que vous invariablement besoin est un certain nombre de chaînes uniques , par exemple, à utiliser comme identificateurs à certaines fins.

il y a deux principales façons d'obtenir strictement unique cordes: déterministe (qui n'est pas aléatoire) et de stocker/comparer (qui est onéreux). Que faisons-nous? Nous donner l'esprit. Nous allons avec probabilistic uniqueness à la place. C'est-à-dire que nous acceptons qu'il y ait un certain risque (même minime) que nos liens ne soient pas uniques. C'est là que la compréhension Probabilité de collision et l'entropie sont utiles.

donc je vais reformuler le besoin invariable comme ayant besoin d'un certain nombre de chaînes avec un petit risque de répétition. À titre d'exemple concret, imaginons que vous souhaitez générer un potentiel de 5 millions d'Identifiants. Vous ne voulez pas stocker et comparer chaque nouvelle chaîne, et vous voulez qu'ils soient aléatoires, donc vous acceptez un certain risque de répéter. Par exemple, disons un risque de moins de 1 sur mille milliards chance de répéter. De quelle longueur de corde avez-vous besoin? Cette question n'est pas précisée car elle dépend des caractères utilisés. Mais plus important encore, c'est une idée fausse. Ce que vous avez besoin est une spécification de l'entropie de cordes, pas de leur longueur. L'entropie peut être directement liée à la probabilité d'une répétition dans un certain nombre de chaînes. La longueur de la corde ne peut pas.

et c'est là qu'une bibliothèque comme EntropyString peut aider. Pour générer de l'aléatoire Id qui ont moins de 1 billion de chance de répéter à 5 millions de chaînes à l'aide de entropy-string :

import {Random, Entropy} from 'entropy-string'

const random = new Random()
const bits = Entropy.bits(5e6, 1e12)

const string = random.string(bits)

"44hTNghjNHGGRHqH9 "

entropy-string utilise un jeu de caractères avec 32 caractères par défaut. Il y a d'autres jeux de caractères prédéfinis, et vous pouvez spécifier vos propres caractères aussi bien. Par exemple, générer des ID avec la même entropie que ci-dessus, mais en utilisant des caractères hexadécimaux:

import {Random, Entropy, charSet16} from './entropy-string'

const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)

const string = random.string(bits)

"27b33372ade513715481f "

noter la différence de longueur de chaîne due à la différence dans le nombre total de caractères dans le jeu de caractères utilisé. Le risque de répéter dans le nombre de chaînes est le même. Les longueurs de chaîne ne le sont pas. Et surtout, le risque de répétition et le nombre potentiel de cordes est explicite. Plus de devinettes avec la longueur de la corde.

3
répondu dingo sky 2017-09-02 21:10:44

développement sur L'exemple élégant de Doubletap en répondant aux questions Gertas et Dragon soulevées. Il suffit d'ajouter une boucle while pour tester ces rares circonstances nulles, et limiter les caractères à cinq.

function rndStr() {
    x=Math.random().toString(36).substring(7).substr(0,5);
    while (x.length!=5){
        x=Math.random().toString(36).substring(7).substr(0,5);
    }
    return x;
}

voici un jsfiddle vous alertant avec un résultat: http://jsfiddle.net/pLJJ7 /

2
répondu Steven DAmico 2013-03-17 00:44:10