В настоящее время я генерирую 8-символьную псевдослучайную строку в верхнем регистре для "A" .. "Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
но он не выглядит чистым и не может быть передан в качестве аргумента, поскольку это не одно утверждение. Чтобы получить строку со смешанным регистром "a" .. "z" плюс "A" .. "Z", я изменил ее на:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
но это похоже на мусор.
У кого-нибудь есть лучший метод?
reset_user_password!(random_string)
гдеdef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64
Ответы:
Я провожу слишком много времени в гольфе.
И последний, который еще более запутанный, но более гибкий и тратит меньше циклов:
источник
('a'..'z').to_a.shuffle[0,8].join
. Обратите внимание, что вам понадобится Ruby> = 1,9shuffle
.SecureRandom
как один пример, в других ответах.[*('a'..'z'),*('0'..'9')].shuffle[0,8].join
генерировать случайную строку с буквами и цифрами.rand
является детерминированным и предсказуемым. Не используйте это для генерации паролей!SecureRandom
Вместо этого используйте одно из решений.Почему бы не использовать SecureRandom?
SecureRandom также имеет методы для:
см .: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
источник
require 'securerandom'
получить этого аккуратногоSecureRandom
помощника :)SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")
сгенерирует строку с 0-9a-z (36 символов) длиной ВСЕГДА 12 символов. Измените 12 на любую длину, какую хотите. К сожалению, нет способа просто использовать AZInteger#to_s
.+fGH1
URL-адрес, вам просто нужно закодировать его URL-адресом так, как если бы вы ЛЮБИЛИ значение, проходящее через URL-адрес:%2BfGH1
Я использую это для генерации случайных URL-дружественных строк с гарантированной максимальной длиной:
Он генерирует случайные строки из строчных букв az и 0-9. Это не очень настраиваемый, но он короткий и чистый.
источник
rand.to_s
; некрасиво, но работает.length
длину, примерно один раз в ~ 40(36**(length-1) + rand(36**length)).to_s(36)
. 36 ** (длина-1), преобразованная в основание 36, равна 10 ** (длина-1), что является наименьшим значением, имеющим необходимую длину цифры.(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
NameError: undefined local variable or method
длина 'для main: Object`Это решение генерирует строку легко читаемых символов для кодов активации; Я не хотел, чтобы люди путали 8 с B, 1 с I, 0 с O, L с 1 и т. Д.
источник
SecureRandom.random_number(charset.size)
вместоrand(charset.size)
%w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}
и%w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }
(первый список не включает строчные буквы, но он длиннее). Интересно, как это Разработаны.Другие упоминали что-то похожее, но при этом используется функция безопасного URL.
Результат может содержать AZ, az, 0-9, «-» и «_». «=» Также используется, если отступ равен true.
источник
Начиная с Ruby 2.5, это действительно легко с
SecureRandom.alphanumeric
:Он генерирует случайные строки, содержащие AZ, az и 0-9, и поэтому должен применяться в большинстве случаев использования. И они генерируются случайным образом, что также может быть полезным.
Это тест для сравнения с решением, имеющим наибольшее количество голосов:
Таким образом,
rand
решение занимает всего около 3/4 времениSecureRandom
. Это может иметь значение, если вы генерируете много строк, но если вы просто время от времени создаете какую-то случайную строку, я всегда выбираю более безопасную реализацию, так как ее также проще вызывать и более явной.источник
Генерация случайной 8-буквенной строки (например, NVAYXHGR)
Генерация случайной 8-символьной строки (например, 3PH4SWF2), исключая 0/1 / I / O. Рубин 1.9
источник
[*("A".."Z")]'
; ((не один раз))stub
этоrspec
передать.Я не могу вспомнить, где я нашел это, но мне кажется, что это лучший и наименее интенсивный процесс:
источник
0
И1
иO
иI
намеренно не хватает , потому что эти персонажи неоднозначны. Если этот вид кода используется для генерации набора символов, который пользователь должен скопировать, лучше исключить символы, которые может быть трудно выделить вне контекста.источник
Random.new.bytes(9)
n=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
Если вы хотите строку указанной длины, используйте:
Он сгенерирует случайную строку длины,
2n
содержащую0-9
иa-f
источник
n
, он фактически генерирует строку, которая составляет 4/3n
..hex
2n. Документация: SecureRandom.hex генерирует случайную шестнадцатеричную строку. Аргумент n указывает длину в байтах случайного числа, которое должно быть сгенерировано. Длина получающейся шестнадцатеричной строки в два раза больше n .Array.new(n){[*"0".."9"].sample}.join
гдеn=8
в вашем случае.Обобщенный:
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
и т. Д.From: " Генерировать псевдослучайную строку AZ, 0-9 ".
источник
источник
Ruby 1.9+:
источник
map
Решение очень приятно!#sample
сколько элементов вы хотите. НапримерALPHABET.sample(10).join
... ruby-doc.org/core-2.4.0/Array.html#method-i-samplesample(10)
дает вам 10 уникальных образцов. Но вы хотите позволить им повториться. Но я бы использовалArray.new(10).map
для производительностиArray.new
и его синтаксис блока.Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
Вот простой строковый код для случайной строки длиной 8:
Вы также можете использовать его для произвольного пароля длиной 8:
источник
P(36, 8) / 36^8 = 0.4
возможное пространство символов для 8 символов (~ в 2 раза легче грубой силы) илиP(36, 25) / 36^25 = 0.00001
из возможного пространства символов для 25 символов (~ 100 000 раз проще для грубой силы).Помните:
rand
предсказуемо для злоумышленника и, следовательно, вероятно, небезопасно. Вы обязательно должны использовать SecureRandom, если это для генерации паролей. Я использую что-то вроде этого:источник
Вот один простой код для случайного пароля длиной 8:
источник
Еще один метод, который мне нравится использовать:
Добавьте,
ljust
если вы действительно параноик по поводу правильной длины строки:источник
Что-то из Devise
источник
.tr('+/=lIO0', 'pqrsxyz')
?Я думаю, что это хороший баланс краткости, ясности и простоты модификации.
Легко модифицируется
Например, включая цифры:
Прописные шестнадцатеричные:
Для действительно впечатляющего множества персонажей:
источник
Просто добавив мои центы здесь ...
источник
rand
Вы можете использовать
String#random
из граней рубинового камняfacets
.Это в основном делает это:
источник
Мой любимый это
(:A..:Z).to_a.shuffle[0,8].join
. Обратите внимание, что для перемешивания требуется Ruby> 1,9.источник
Это решение нуждается во внешней зависимости, но кажется более привлекательным, чем другое.
Faker::Lorem.characters(10) # => "ang9cbhoa8"
источник
Данный:
Одно выражение, которое может быть передано в качестве аргумента, допускает дублирование символов:
источник
Думаю, мне больше всего нравится ответ Радар. Я бы немного подправил так:
источник
(CHARS*length).sample(length).join
?CHARS=['a','b']
тогда ваш метод будет генерировать"aa"
или"bb"
только 33% времени, но"ab"
или"ba"
67% времени. Может быть, это не проблема, но это стоит иметь в виду!источник
Мои 2 цента:
источник
Я просто пишу небольшой гем
random_token
для генерации случайных токенов для большинства случаев использования, наслаждайтесь ~https://github.com/sibevin/random_token
источник
2 решения для случайной строки, состоящей из 3 диапазонов:
Один персонаж от каждого диапазона.
И если вам нужен хотя бы один символ из каждого диапазона, например, для создания случайного пароля, который состоит из одной заглавной буквы, одной строчной буквы и одной цифры, вы можете сделать что-то вроде этого:
источник
( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
Недавно я делал что-то подобное, чтобы сгенерировать 8-байтовую случайную строку из 62 символов. Символы были 0-9, az, AZ. У меня был их массив, так как я делал 8 циклов и выбирал случайное значение из массива. Это было внутри приложения Rails.
Странно то, что я получил много дубликатов. Теперь случайно это почти никогда не должно происходить. 62 ^ 8 огромен, но из 1200 или около того кодов в БД у меня было много дубликатов. Я заметил, что они происходят на часовых границах друг друга. Другими словами, я мог бы увидеть дуплет в 12:12:23 и 2:12:22 или что-то в этом роде ... не уверен, является ли время проблемой или нет.
Этот код был в до создания объекта ActiveRecord. Перед созданием записи этот код запускается и генерирует «уникальный» код. Записи в БД всегда создавались надежно, но код (
str
в приведенной выше строке) дублировался слишком часто.Я создал сценарий для выполнения 100000 итераций этой строки с небольшой задержкой, поэтому потребуется 3-4 часа в надежде увидеть какой-то повторяющийся шаблон на почасовой основе, но ничего не увидел. Я понятия не имею, почему это происходило в моем приложении Rails.
источник