Créer un jeton aléatoire en Javascript basé sur les détails de l'utilisateur

Je veux créer une chaîne aléatoire (jeton) qui peut être utilisée pour identifier un utilisateur tout en évitant tout conflit potentiel avec les Jetons des autres utilisateurs.

Ce à quoi je pensais était un hachage MD5 de navigator.userAgent + new Date().getTime() pour générer le jeton, mais cela nécessite toute une bibliothèque Javascript MD5 pour le hacher, ce que je ne veux pas vraiment faire.

Il doit être composé de A-Z / 0-9 caractères et idéalement pas plus de 32 caractères. Je suis ouvert à toutes les idées. Merci!

Juste pour clarifier, je ne suis pas vous recherchez un générateur de chaîne aléatoire, la chaîne aléatoire doit être générée à partir des détails des utilisateurs disponibles via Javascript et peut également utiliser le temps pour éviter les conflits potentiels!

21
demandé sur fire 2011-12-16 13:50:41

6 réponses

Commander crypto.projet js. C'est une collection d'algorithmes cryptographiques. Le projet a des fichiers JS séparés pour chaque algorithme de hachage.

3
répondu Josnidhin 2011-12-16 09:58:48

Vous pouvez générer un nombre aléatoire et le convertir en base 36 (0-9a-z):

var rand = function() {
    return Math.random().toString(36).substr(2); // remove `0.`
};

var token = function() {
    return rand() + rand(); // to make it longer
};

token(); // "bnh5yzdirjinqaorq0ox1tf383nb3xr"
96
répondu pimvdb 2011-12-16 09:53:09

Cette fonction vous permet de définir la longueur du jeton et les caractères autorisés.

function generate_token(length){
    //edit the token allowed characters
    var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
    var b = [];  
    for (var i=0; i<length; i++) {
        var j = (Math.random() * (a.length-1)).toFixed(0);
        b[i] = a[j];
    }
    return b.join("");
}

Appelez Simplement generate_token

generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
2
répondu Kareem 2017-10-22 13:03:59

Il est très peu probable, mais les mathématiques.random() pourrait renvoyer 0.0. Dans ce cas, la solution de pimvdb retournerait "" (chaîne vide). Donc, voici une autre solution, qui renvoie dans tous les cas un base36 aléatoire avec une longueur de 10 caractères:

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
1
répondu shaack 2018-05-07 09:06:11

//length: defines the length of characters to express in the string

const rand=()=>Math.random(0).toString(36).substr(2);
const token=(length)=>(rand()+rand()+rand()+rand()).substr(0,length);

console.log(token(40));
//example1:  token(10) => result: tsywlmdqu6
//example2:  token(40) => result: m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10
1
répondu Jesús Perez 2018-06-13 13:08:02

J'utilise une approche similaire à de Kareem, mais avec moins d'appels de fonction et d'opérations de tableau intégrées pour un gros coup de pouce dans les performances.

Selon un test de performance , cette méthode surpasse également la réponse acceptée d'une petite marge. De plus, il fournit un paramètre n pour générer n'importe quelle longueur de jeton de taille à partir d'une liste blanche de caractères acceptables. Il est flexible et fonctionne bien.

function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
0
répondu ThisClark 2018-02-25 19:34:01