Создать случайный токен в Javascript на основе данных пользователя - PullRequest
25 голосов
/ 16 декабря 2011

Я хочу создать случайную строку (токен), которую можно использовать для идентификации пользователя, избегая при этом любых потенциальных конфликтов с токенами любых других пользователей.

То, о чем я думал, это хеш MD5 navigator.userAgent + new Date().getTime() для генерации токена, но для его хеширования нужна целая библиотека Javascript MD5, чего я не хочу делать.

Он должен состоять из символов A-Z / 0-9 и в идеале не более 32 символов. Я открыт для всех идей. Спасибо!

Просто чтобы пояснить, что я не ищу генератора случайных строк, случайная строка должна быть сгенерирована из пользовательских данных, доступных через Javascript, а также может использовать время, чтобы избежать потенциальных конфликтов!

Ответы [ 6 ]

105 голосов
/ 16 декабря 2011

Вы можете сгенерировать случайное число и преобразовать его в базу 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"
6 голосов
/ 22 октября 2017

Эта функция позволяет установить длину токена и допустимые символы.

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

Просто вызовите generate_token

generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
5 голосов
/ 16 декабря 2011

Оформить заказ crypto.js проект. Это коллекция криптографических алгоритмов. В проекте есть отдельные js-файлы для каждого алгоритма хеширования.

3 голосов
/ 30 декабря 2017

Я использую подход, аналогичный Kareem , но с меньшим количеством вызовов функций и встроенных операций с массивами для значительного повышения производительности.

Согласно тесту производительности этот метод также превосходит принятый ответ с небольшим отрывом. Кроме того, он предоставляет параметр n для генерации длины токена любого размера из белого списка допустимых символов. Он гибкий и хорошо работает.

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;
}
2 голосов
/ 13 июня 2018

//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
2 голосов
/ 07 мая 2018

Это очень маловероятно, но Math.random () может вернуть 0.0. В этом случае решение pimvdb вернет "" (пустая строка). Итак, вот еще одно решение, которое в каждом случае возвращает случайное основание 36 с длиной 10 символов:

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
...