Вопрос по javascript, random – Случайная буквенно-цифровая строка в JavaScript? [Дубликат]

181

This ques#ion already has an answer here:

Genera#e random s#ring/charac#ers in JavaScrip# 61 answers

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

@Pavel, вот что такое гольф-код .... Neal
Ха-ха нет! Это не соревнование для тех, кто может упаковать свой код лучше всех. Я видел некоторые решения, которые перечисляют весь набор символов в строке, что казалось расточительным. Просто ищу что-то не намного дольше, чем нужно. Pavel
@neal удаление избыточности - это хорошая инженерная практика, Code Golf пишет наименьшее количество кода (часто с использованием односимвольных переменных, побочных эффектов и других неэффективных методов). Они похожи, но очень различны. mikemaccana
Кратчайший путь? Это вопрос кода гольф? Greg Hewgill

Ваш Ответ

17   ответов
-2

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

Кратчайший путь:

md5(Math.random())

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

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

1

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

Аргумент 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"
244

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

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

Скрипки: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);
}
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMath.round(Math.random() * (chars.length - 1))Error: User Rate Limit Exceeded[0]Error: User Rate Limit Exceeded[chars.length-1]Error: User Rate Limit Exceeded[0, 0.5)Error: User Rate Limit Exceeded[chars.length-2+0.5, chars.length-1)Error: User Rate Limit Exceeded[index-0.5, index+0.5)Error: User Rate Limit ExceededparseInt(Math.random() * chars.length)Error: User Rate Limit Exceededchars.lengthError: User Rate Limit Exceededw3schools.com/jsref/jsref_random.asp
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededTHISError: User Rate Limit ExceededrandomString(..)Error: User Rate Limit Exceededfor(var i=0;i<50;i++){}Error: User Rate Limit Exceededdocument.write(randomString(8, '#aA!') + "</br>");
Error: User Rate Limit ExceededMath.random()Error: User Rate Limit Exceeded[0, 1)Error: User Rate Limit Exceededgoo.gl/BQGZiGError: User Rate Limit Exceededgoo.gl/MPuCJMError: User Rate Limit Exceededgoo.gl/qXrK7PError: User Rate Limit Exceededgoo.gl/CUoyIT (numError: User Rate Limit Exceeded1Error: User Rate Limit Exceededgoo.gl/D9az3CError: User Rate Limit Exceededgoo.gl/0mERDqError: User Rate Limit Exceeded
2

Использование 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>

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded_.sampleSize("abcdef0123456789", 6).join("")
_.sample()Error: User Rate Limit Exceeded_.sampleSize()
7

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

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
5
function randomString(len) {
    var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}

Резюме:

  1. Create an array of the size we want (because there's no range(len) equivalent in javascript.
  2. For each element in the array: pick a random character from p and add it to a string
  3. Return the generated string.

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

[...Array(len)]

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

.reduce(

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

a=>a+...

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

a этоaccumulator. В этом случае это строка конечного результата, которую мы собираемся вернуть, когда мы это сделаем (вы знаете, что это строка, потому что второй аргумент функции Reduce,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. ~ is the bitwise NOT operator in javascript. ~~ короче, возможно, иногда быстрее и определенно веселееMath.floor( Вот некоторая информация

Error: User Rate Limit Exceeded
2
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;
};
27

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Когда я увидел этот вопрос, я подумал о том, когда мне нужно было генерировать 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();
}

Скрипки:http://jsfiddle.net/nlviands/fNPvf/11227/

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/a/8809472/988540
1

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

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

16

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

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

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

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

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

Error: User Rate Limit Exceeded
15

Это чище

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

пример

Math.random().toString(36).substr(2, 5)
Error: User Rate Limit Exceeded
18

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

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
300

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

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

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

  • This will produce a string anywhere between zero and 12 characters long, usually 11 characters, due to the fact that floating point stringification removes trailing zeros.
  • It won't generate capital letters, only lower-case and numbers.
  • Because the randomness comes from Math.random(), the output may be predictable and therefore not necessarily unique.
  • Even assuming an ideal implementation, the output has at most 52 bits of entropy, which means you can expect a duplicate after around 70M strings generated.
Error: User Rate Limit Exceededslice(2)Error: User Rate Limit Exceededsubstr(2,16): jacklmoore.com/notes/substring-substr-slice-javascript
Error: User Rate Limit Exceededstackoverflow.com/a/8084248/610573
Error: User Rate Limit Exceeded0.000001Error: User Rate Limit ExceededtoString()Error: User Rate Limit Exceeded3.4854687E-7Error: User Rate Limit Exceeded4854687E-7Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfunction rStr() { var s=Math.random().toString(36).slice(2); return s.length===16 ? s : rStr(); }
1

Красиво и просто, и не ограничено определенным количеством символов:

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

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

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/

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded] 4INBKJ\`_5.(/"__X,,K"\)]Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededM&I56aP=H K?<T*, ;0'9_c5Tb

Похожие вопросы