Ответ 1
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
Как я могу создать псевдослучайную строку n-символа, содержащую только A-Z
, 0-9
как SecureRandom.base64 без "+"
, "/"
и "="
? Например:
(0..n).map {(('1'..'9').to_a + ('A'..'Z').to_a)[rand(36)]}.join
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
Даже грубая сила довольно проста:
n = 20
c = [*?A..?Z + *?0..?9]
size = c.size
n.times.map { c[rand(size)] }.join
#=> "IE210UOTDSJDKM67XCG1"
или, без замены:
c.sample(n).join
#=> "GN5ZC0HFDCO2G5M47VYW"
если это необходимо. (Я изначально имел c = [*(?A..?Z)] + [*(?0..?9)]
, но видел из ответа @sawa, что это можно было бы упростить совсем немного.)
Элегантный способ сделать это в Rails 5 (я не тестирую это в других версиях Rails):
SecureRandom.urlsafe_base64(n)
где n
- это количество цифр, которое вы хотите.
ps: SecureRandom
использует массив для монтирования вашей буквенно-цифровой строки, поэтому имейте в виду, что n
должно быть количеством цифр, которое вы хотите + 1.
например: если вы хотите 8-значный буквенно-цифровой:
SecureRandom.urlsafe_base64(9)
Чтобы создать случайную строку от 10 до 20 символов, включая только от А до Я и числа, оба всегда:
require 'string_pattern'
puts "10-20:/XN/".gen