Я хочу, чтобы 5-символьная строка состояла из символов, выбранных случайным образом из набора [a-zA-Z0-9]
.
Какой лучший способ сделать это с помощью JavaScript?
javascript
random
Том Леман
источник
источник
true-random
результата! Они толькоpseudo-random
. При использовании случайных строк для защиты или безопасности не используйте ни одну из них !!! Попробуйте один из этих API: random.orgMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Ответы:
Я думаю, что это будет работать для вас:
источник
+=
таких строк вызывает поведение O (n ^ 2). Если вы хотите создать более длинные строки, вы должны создать массив отдельных символов и соединить их вместе в конце.+=
часто почему-то быстрее, даже используется внутри циклов - jsperf.com/join-vs-concatenationcrypto
вместо этого.Примечание: приведенный выше алгоритм имеет следующие недостатки:
Math.random()
может выдавать предсказуемый («случайный», но не случайный) результат в зависимости от реализации. Результирующая строка не подходит, когда вам нужно гарантировать уникальность или непредсказуемость.источник
Math.random().toString(36).substr(2, 5)
, потому что.substring(7)
заставляет его быть длиннее 5 символов. Полный балл, все же!toString
Метод числового типа в javascript принимает необязательный параметр для преобразования числа в заданную базу. Например, если вы передадите два, вы увидите, что ваш номер представлен в двоичном виде. Как и в шестнадцатеричном (основание 16), основание 36 использует буквы для представления цифр за пределами 9. Преобразовав случайное число в основание 36, вы получите кучу, казалось бы, случайных букв и цифр.(Math.random() + 1).toString(36).substring(7);
Math.random это плохо для такого рода вещей
Опция 1
Если вы можете сделать это на стороне сервера , просто используйте криптомодуль -
Результирующая строка будет в два раза длиннее случайных байтов, которые вы генерируете; каждый байт, закодированный в шестнадцатеричный код, состоит из 2 символов. 20 байтов будут 40 символами гекса.
Вариант 2
Если вам нужно сделать это на стороне клиента , возможно, попробуйте модуль uuid -
Вариант 3
Если вам нужно сделать это на стороне клиента и вам не нужно поддерживать старые браузеры, вы можете сделать это без зависимостей -
Для получения дополнительной информации о
crypto.getRandomValues
-Вот небольшой пример консоли -
Для поддержки IE11 вы можете использовать -
Для покрытия браузера см. Https://caniuse.com/#feat=getrandomvalues
источник
.map()
в варианте 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Спасибо за то, что познакомили меня с этими функциями :-)require
модуль не может быть использован только на стороне сервера?Коротко, просто и надежно
Возвращает ровно 5 случайных символов, в отличие от некоторых самых популярных ответов, найденных здесь.
источник
Math.random().toString(36)
возвращает число менее 5 символов?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Вот улучшение превосходного ответа даблтапа . У оригинала есть два недостатка, которые рассматриваются здесь:
Во-первых, как уже упоминали другие, существует небольшая вероятность создания коротких строк или даже пустой строки (если случайное число равно 0), что может нарушить работу вашего приложения. Вот решение:
Во-вторых, и оригинал, и приведенное выше решение ограничивают размер строки N до 16 символов. Следующее вернет строку размера N для любого N (но учтите, что использование N> 16 не увеличит случайность и не уменьшит вероятность столкновений):
Объяснение:
Дальнейшие мысли:
Обновить:
Вот пара других однострочников в функциональном стиле, которые я придумал. Они отличаются от решения выше тем, что:
Итак, скажем, ваш алфавит выбора
Тогда эти два эквивалента друг другу, так что вы можете выбрать тот, который является более интуитивным для вас:
а также
Редактировать:
Я, кажется, как Qubyte и Мартейн де Миллиано придумали решения, аналогичные последним (слава!), я почему-то упустил. Так как они не выглядят короткими с первого взгляда, я все равно оставлю это здесь на тот случай, если кто-то действительно хочет однострочника :-)
Кроме того, во всех решениях заменили 'new Array' на 'Array', чтобы сбрить еще несколько байтов.
источник
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
дает ожидаемый результат, который больше похож на.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
Самое компактное решение, потому что
slice
корочеsubstring
. Вычитание из конца строки позволяет избежать символа с плавающей точкой, сгенерированногоrandom
функцией:или даже
Обновление: добавлен еще один подход с использованием
btoa
метода:источник
Math.random().toString(36).slice(-5);
- Что, еслиMath.random()
вернется0.0
?"0"
;)Math.random()
возвращает,0.5
то результат есть"0.i"
. Не уверен, что есть другие крайние случаи. Просто хотел отметить, что это неправильный ответ на вопрос (5 символов из [a-zA-Z0-9]).(+new Date + Math.random())
чтобы предотвратить это дело. В любом случае, спасибо за примечание.Как то так должно работать
Позвоните с набором символов по умолчанию [a-zA-Z0-9] или отправьте по своему усмотрению:
источник
len
прямо вwhile
циклеБолее новая версия с оператором распространения es6 :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
произвольное число, вы можете выбрать любую желаемую длину токена36
Максимальное число радикс вы можете перейти к numeric.toString () , что означает все номера и азимуту строчные буквы2
Используются , чтобы выбрать 3 - й индекс от случайной строки , которая выглядит следующим образом :"0.mfbiohx64i"
мы могли бы взять любой индекс после0.
источник
источник
while(s.length< L) s+= randomchar();
while(L--)
сделаем это'A'.charCodeAt(0)
, чем магический номер55
(и аналогично для61
). Тем более что на моей платформе все равно магическое число, которое возвращается65
. Этот код также лучше документирует себя.Генератор случайных строк (буквенно-цифровой | буквенно-цифровой)
В то время как вышесказанное использует дополнительные проверки для желаемых A / N, A, N выходов , давайте разберем их с основными (только буквенно-цифровыми) для лучшего понимания:
var str = "";
для объединения случайных символовrand
порядковый номер от 0 до 61 (0..9 + A..Z + a..z = 62)rand
(так как это 0..61), увеличивая ее на некоторое число (см. Примеры ниже), чтобы получить верноеCharCode
число и соответствующий символ.str
сString.fromCharCode( incremented rand )
Давайте изобразим диапазоны таблицы символов ASCII :
Math.floor( Math.random * 62 )
дает диапазон от0..61
(что нам нужно).Давайте исправим случайность, чтобы получить правильные диапазоны charCode :
Условная операция логика из приведенных выше таблиц:
Из приведенного выше объяснения вот итоговый буквенно-цифровой фрагмент :
Или если вы будете:
источник
Самый простой способ:
Это генерирует случайные строки из 5 символов на основе текущего времени. Пример вывода -
4mtxj
или4mv90
или4mwp1
Проблема в том, что если вы вызываете его два раза в одну и ту же секунду, он генерирует одну и ту же строку.
Более безопасный способ:
Это сгенерирует случайную строку из 4 или 5 символов, всегда отличающихся. Пример вывода похож на
30jzm
или1r591
или4su1a
В обоих случаях первая часть генерирует случайное число.
.toString(36)
Часть отбрасывать число в base36 (alphadecimal) представления о нем.источник
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
чтобы покрыть его.(Math.random()*1e20).toString(36)
.Вот несколько простых лайнеров. + Изменить
new Array(5)
чтобы установить длину.Включая
0-9a-z
Включая
0-9a-zA-Z
источник
Я знаю, что все уже поняли это правильно, но я чувствовал, что хочу попробовать этот способ самым легким способом (легкий на код, а не на процессор):
Требуется немного времени, чтобы обернуть голову, но я думаю, что это действительно показывает, каков классный синтаксис javascript.
источник
current = current ? current : '';
когда вы можете писатьcurrent = current || ''
;current || (current = '');
Если вы используете Lodash или Underscore , то это так просто:
источник
_.sampleSize('asdfgh',5).join('')
Для удовлетворения требования [a-zA-Z0-9] и длины = 5 используйте
Будут встречаться строчные буквы, прописные буквы и цифры.
источник
В случае, если кто-то заинтересован в одной строке (хотя для вашего удобства она не отформатирована как таковая), которая выделяет память сразу (но учтите, что для небольших строк это действительно не имеет значения), вот как это сделать:
Вы можете заменить
5
на длину строки, которую вы хотите. Спасибо @AriyaHidayat в этом посте за решениеmap
функции, не работающей с разреженным массивом, созданнымArray(5)
.источник
Вот метод, который я создал.
Это создаст строку, содержащую как прописные, так и строчные буквы.
Кроме того, я включил функцию, которая будет также создавать буквенно-цифровую строку.
Рабочие примеры:
http://jsfiddle.net/greatbigmassive/vhsxs/ (только альфа)
http://jsfiddle.net/greatbigmassive/PJwg8/ (буквенно-цифровой)
Обновление Июль 2015
Это делает то же самое, но имеет больше смысла и включает в себя все буквы.
источник
Предполагая, что вы используете underscorejs , можно элегантно сгенерировать случайную строку всего за две строки:
источник
источник
Быстрый и улучшенный алгоритм. Не гарантирует форму (см. Комментарии).
источник
crypto.getRandomValues
возвращает одно из 256 уникальных значений. Поскольку 256 не делится на 62, вероятность того, что персонажи получат AH, несколько выше. Я думаю, что лучшим решением будет сделать то, что сделал YouTube, и просто добавить 2 дополнительных символа (возможно,-
и_
) в кодировку. Во всяком случае, отличная работа - этот ответ требует гораздо больше любви :)Проблема с ответами на вопросы «Мне нужны случайные строки» (на любом языке) состоит в том, что практически каждое решение использует некорректную первичную спецификацию длины строки . Сами вопросы редко показывают, зачем нужны случайные строки, но я бы сказал, что вам редко нужны случайные строки длины, скажем, 8. Что вам обязательно нужно, так это некоторое количество уникальных строк , например, для использования в качестве идентификаторов для каких-то целей.
Есть два основных способа получения строго уникальных строк: детерминистично (что не случайно) и хранить / сравнивать (что обременительно). Что мы делаем? Мы отдаем призрак. Вместо этого мы используем вероятностную уникальность . То есть мы признаем, что существует некоторый (хотя и небольшой) риск того, что наши строки не будут уникальными. Это где понимание вероятности столкновения и энтропии полезно .
Поэтому я перефразирую неизменную потребность как нужное количество строк с небольшим риском повторения. В качестве конкретного примера предположим, что вы хотите создать 5 миллионов идентификаторов. Вы не хотите хранить и сравнивать каждую новую строку, и вы хотите, чтобы они были случайными, поэтому вы принимаете некоторый риск повторения. Например, допустим, что риск повторения меньше 1 в триллионе. Так какая длина строки вам нужна? Ну, этот вопрос недостаточно конкретизирован, поскольку зависит от используемых символов. Но что более важно, это ошибочно. Вам нужно указать энтропию строк, а не их длину. Энтропия может быть напрямую связана с вероятностью повторения в некотором количестве строк. Длина строки не может.
И здесь может помочь библиотека вроде EntropyString . Чтобы сгенерировать случайные идентификаторы с шансом повторения менее 1 на триллион в 5 миллионах строк, используйте
entropy-string
:entropy-string
по умолчанию использует набор из 32 символов. Существуют и другие предопределенные наборы символов, и вы также можете указать свои собственные символы. Например, генерация идентификаторов с той же энтропией, что и выше, но с использованием шестнадцатеричных символов:Обратите внимание на разницу в длине строки из-за разницы в общем количестве символов в используемом наборе символов. Риск повторения в указанном количестве потенциальных строк одинаков. Длина строки не. И, что лучше всего, риск повторения и потенциальное количество строк явно. Больше не нужно гадать с длиной строки.
источник
Это настолько чисто, насколько это возможно. Это тоже быстро, http://jsperf.com/ay-random-string .
источник
strLength - 1
: - /--strLength
чтобыstrLength--
исправить это для меня.Вы можете просмотреть массив элементов и рекурсивно добавить их в строковую переменную, например, если вы хотите случайную последовательность ДНК:
источник
Один лайнер:
источник
Array(15)
на меньшее значение. Например:Array(4)
.Я не нашел чистого решения для поддержки как строчных, так и прописных букв.
Поддержка только в нижнем регистре:
Math.random().toString(36).substr(2, 5)
Основываясь на этом решении для поддержки строчных и прописных букв:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Измените значение
5
вsubstr(2, 5)
нужной длине.источник
Это работает точно
источник
Как насчет этого:
Date.now().toString(36)
Не очень случайный, но короткий и совершенно уникальный каждый раз, когда вы называете это.источник
Date.now()
имеет разрешение только в миллисекундах. Например, при запуске в простом цикле вы получите много дубликатов.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
,Буквенно-цифровые символы без учета регистра:
Преимущество этой функции заключается в том, что вы можете получить произвольную строку разной длины, и она обеспечивает длину строки.
Чувствительный к регистру все символы:
Пользовательские символы
источник
var possible
подобное в принятый ответ, чтобы результат функции был более настраиваемым.Генерировать 10 символов длинной строки. Длина задается параметром (по умолчанию 10).
источник
Вы можете использовать Coderain . Это библиотека для генерации случайных кодов по заданному шаблону. Используйте
#
в качестве заполнителя для прописных и строчных букв, а также цифр:Есть и другие заполнители, такие как
A
заглавные буквы или9
цифры.Что может быть полезным, так это
.next()
всегда даст вам уникальный результат, поэтому вам не придется беспокоиться о дубликатах.Вот демонстрационное приложение, которое генерирует список уникальных случайных кодов .
Полное раскрытие: я автор Coderain.
источник