Какой самый короткий способ (в пределах разумного) генерировать случайную буквенно-цифровую (верхнюю, нижнюю и цифровую) строку в 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)],'');
}
Резюме:
- Создайте массив нужного нам размера (потому что в javascript нет эквивалента
range(len)
.- Для каждого элемента в массиве: выберите случайный символ из
p
и добавьте его в строку- Вернуть сгенерированную строку.
Некоторое объяснение:
[...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();
}
Ответ 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)