Случайная буквенно-цифровая строка в JavaScript?

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

Ответ 1

Если вы хотите разрешить только определенные символы, вы также можете сделать это следующим образом:

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

Здесь показан пример: http://jsfiddle.net/wSQBx/

Другим способом сделать это может быть использование специальной строки, которая сообщает функции, какие типы символов использовать. Вы можете сделать это вот так:

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 += '~`[email protected]#$%^&*()_+-={}[]:";\'<>?,./|\\';
    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/

В качестве альтернативы, чтобы использовать метод base36, как описано ниже, вы можете сделать что-то вроде этого:

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

Ответ 2

Я только что натолкнулся на это как действительно хорошее и элегантное решение:

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

Примечания к этой реализации:

  • В результате получится строка длиной от нуля до 12 символов, обычно 11 символов, из-за того, что при строковой обработке с плавающей запятой удаляются завершающие нули.
  • Он не будет генерировать заглавные буквы, только строчные буквы и цифры.
  • Поскольку случайность происходит из Math.random(), выходные данные могут быть предсказуемыми и, следовательно, не обязательно уникальными.
  • Даже если предположить идеальную реализацию, выход имеет не более 52 битов энтропии, что означает, что вы можете ожидать дубликат после примерно 70M сгенерированных строк.

Ответ 3

Другая вариация ответа, предложенная JAR.JAR.beans

(Math.random()*1e32).toString(36)

Изменяя мультипликатор 1e32, вы можете изменить длину случайной строки.

Ответ 4

Или, опираясь на то, что предложил Джар Джар, это то, что я использовал в недавнем проекте (чтобы преодолеть ограничения по длине):

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

Использование:

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

Ответ 5

Однострочный с lodash для случайных 20 символов (буквенно-цифровой строчный регистр):

_.times(20, () => _.random(35).toString(36)).join('');

Ответ 6

Это более чистый

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

Пример

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

Ответ 7

для 32 символов:

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

Ответ 8

Я думаю, что следующее является самым простым решением, которое учитывает заданную длину:

Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')

Это зависит от синтаксиса функции стрелки.

Ответ 9

Случайный персонаж:

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

Случайный int:

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

Положил все это вместе:

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

Скрипка: http://jsfiddle.net/maniator/QZ9J2/

Ответ 10

function randomString(len) {
    var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}

Резюме:

  1. Создайте массив нужного нам размера (потому что в javascript нет эквивалента range(len).
  2. Для каждого элемента в массиве: выберите случайный символ из p и добавьте его в строку
  3. Вернуть сгенерированную строку.

Некоторое объяснение:

[...Array(len)]

Array (len) или new Array (len) создает массив с неопределенными указателями. С одной строчкой будет сложнее справиться. Синтаксис Spread удобно определяет указатели (теперь они указывают на неопределенные объекты!).

.reduce(

В этом случае уменьшите массив до одной строки. Функциональные возможности снижения распространены в большинстве языков и заслуживают изучения.

a=>a+...

Мы используем функцию стрелки.

a является аккумулятором. В этом случае это строка конечного результата, которую мы собираемся вернуть, когда закончим (вы знаете, что это строка, потому что второй аргумент функции Reduction, initialValue - пустая строка: ''). Таким образом, в основном: преобразовать каждый элемент в массиве с p[~~(Math.random()*p.length)], добавить результат в a строки и дать мне, когда вы закончите. a

p[...]

p - это строка символов, из которых мы выбираем. Вы можете получить доступ к символам в строке, такой как индекс (например, "abcdefg"[3] дает нам "d")

~~(Math.random()*p.length)

Math.random() возвращает число с плавающей запятой между [0, 1) Math.floor(Math.random()*max) является стандартом де-факто для получения случайного целого числа в javascript. ~ является побитовым оператором НЕ в JavaScript. ~~ является более коротким, возможно, иногда более быстрым, и определенно более забавным способом сказать Math.floor( здесь некоторая информация

Ответ 11

Использование lodash:

function createRandomString(length) {
        var chars = "abcdefghijklmnopqrstufwxyzABCDEFGHIJKLMNOPQRSTUFWXYZ1234567890"
        var pwd = _.sampleSize(chars, length || 12)  // lodash v4: use _.sampleSize
        return pwd.join("")
    }
document.write(createRandomString(8))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Ответ 12

var randomString = function(length) {
  var str = '';
  var chars ='0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split(
      '');
  var charsLen = chars.length;
  if (!length) {
    length = ~~(Math.random() * charsLen);
  }
  for (var i = 0; i < length; i++) {
    str += chars[~~(Math.random() * charsLen)];
  }
  return str;
};

Ответ 13

Когда я увидел этот вопрос, я подумал, когда мне нужно было генерировать UUID. Я не могу взять кредит за код, так как я уверен, что нашел его здесь в stackoverflow. Если вам не нужны тире в вашей строке, тогда выньте тире. Вот функция:

function generateUUID() {
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c) {
        var r = (d + Math.random()*16)%16 | 0;
        d = Math.floor(d/16);
        return (c=='x' ? r : (r&0x7|0x8)).toString(16);
    });
    return uuid.toUpperCase();
}

Fiddle: http://jsfiddle.net/nlviands/fNPvf/11227/

Ответ 14

Эта функция должна давать произвольную строку любой длины.

function randString(length) {
    var l = length > 25 ? 25 : length;
    var str = Math.random().toString(36).substr(2, l);
    if(str.length >= length){
        return str;
    }
    return str.concat(this.randString(length - str.length));
}

Я тестировал его со следующим тестом, который преуспел.

function test(){
    for(var x = 0; x < 300000; x++){
        if(randString(x).length != x){
            throw new Error('invalid result for len ' + x);
        }
    }
}

Причина, по которой я выбрал 25, состоит в том, что на практике длина строки, возвращаемой из Math.random().toString(36).substr(2, 25), имеет длину 25. Это число можно изменить по своему желанию.

Эта функция рекурсивна и, следовательно, вызов функции с очень большими значениями может привести к Maximum call stack size exceeded. Из моего тестирования я смог получить строку длиной 300 000 символов.

Эта функция может быть преобразована в хвостовую рекурсию, посылая строку в функцию в качестве второго параметра. Я не уверен, использует ли JS оптимизацию вызовов Tail

Ответ 15

Генератор случайных ключей

аргумент keyLength - длина символа, которая требуется для ключа

function keyGen(keyLength) {
    var i, key = "", characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    var charactersLength = characters.length;

    for (i = 0; i < keyLength; i++) {
        key += characters.substr(Math.floor((Math.random() * charactersLength) + 1), 1);
    }

    return key;
}


keyGen(12)
"QEt9mYBiTpYD"

Ответ 16

Приятный и простой, не ограничиваясь определенным количеством символов:

let len = 20, str = "";
while(str.length < len) str += Math.random().toString(36).substr(2);
str = str.substr(0, len);

Ответ 17

Использовать библиотеку md5: https://github.com/blueimp/JavaScript-MD5

Самый короткий путь:

md5(Math.random())

Если вы хотите ограничить размер до 5:

md5(Math.random()).substr(0, 5)