Научите человека ловить рыбу:
Программисты резали бумагу лазерами, а не бензопилами. Использование fringe, специфичных для языка методов для создания наименьшего, наиболее запутанного кода - это мило и все, но никогда не предложит полного решения. Вы должны использовать правильный инструмент для работы.
То, что вы хотите, это строка символов, и символы представлены байтами. И мы можем представить байт в JavaScript, используя число. Итак, мы должны сгенерировать список этих чисел и привести их в виде строк. Вам не нужны дата или base64; Math.random () получит вам число, а String.fromCharCode () превратит его в строку. Легко.
Но какое число соответствует какому символу? UTF-8 - это основной стандарт, используемый в Интернете для интерпретации байтов как символов (хотя JavaScript использует UTF-16 внутри, они перекрываются). Способ решения этой проблемы для программиста - изучить документацию.
UTF-8 перечисляет все клавиши на клавиатуре в цифрах от 0 до 128. Некоторые из них не для печати. Просто выберите нужные символы в ваших случайных строках и найдите их, используя случайно сгенерированные числа.
Сильфон - это функция, которая принимает практически бесконечную длину, генерирует случайное число в цикле и ищет все печатные символы в младших 128 кодах UTF-8. Энтропия присуща, поскольку не все случайные числа будут попадаться каждый раз (непечатные символы, пробелы и т. Д.). Он также будет работать быстрее, если вы добавите больше символов.
Я включил большинство оптимизаций, обсуждаемых в теме:
- Двойная тильда быстрее, чем Math.floor
- операторы if быстрее, чем регулярные выражения
- отправка в массив быстрее, чем конкатенация строк
function randomID(len) {
var char;
var arr = [];
var len = len || 5;
do {
char = ~~(Math.random() * 128);
if ((
(char > 47 && char < 58) || // 0-9
(char > 64 && char < 91) || // A-Z
(char > 96 && char < 123) // a-z
// || (char > 32 && char < 48) // !"#$%&,()*+'-./
// || (char > 59 && char < 65) // <=>?@
// || (char > 90 && char < 97) // [\]^_`
// || (char > 123 && char < 127) // {|}~
)
//security conscious removals: " ' \ `
//&& (char != 34 && char != 39 && char != 92 && char != 96)
) { arr.push(String.fromCharCode(char)) }
} while (arr.length < len);
return arr.join('')
}
var input = document.getElementById('length');
input.onfocus = function() { input.value = ''; }
document.getElementById('button').onclick = function() {
var view = document.getElementById('string');
var is_number = str => ! Number.isNaN( parseInt(str));
if ( is_number(input.value))
view.innerText = randomID(input.value);
else
view.innerText = 'Enter a number';
}
#length {
width: 3em;
color: #484848;
}
#string {
color: #E83838;
font-family: 'sans-serif';
word-wrap: break-word;
}
<input id="length" type="text" value='#'/>
<input id="button" type="button" value="Generate" />
<p id="string"></p>
Почему это так утомительно? Потому что ты можешь. Вы программист. Вы можете заставить компьютер делать что угодно! Кроме того, что, если вам нужна строка символов иврита? Это не трудно. Найдите эти символы в стандарте UTF-8 и найдите их. Освободите себя от таких методов Макдональда, как toString (36).
Иногда опускание до более низкого уровня абстракции - это то, что необходимо для создания реального решения. Понимание основных принципов под рукой может позволить вам настроить свой код так, как вам хочется. Может быть, вы хотите, чтобы бесконечно сгенерированная строка заполняла круговой буфер? Может быть, вы хотите, чтобы все ваши сгенерированные строки были палиндромами? Зачем сдерживаться?