Как сгенерировать случайную строку в Ruby - PullRequest
710 голосов
/ 18 сентября 2008

В настоящее время я генерирую 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}

но это похоже на мусор.

У кого-нибудь есть лучший метод?

Ответы [ 51 ]

2 голосов
/ 03 июля 2012

Если вы работаете в UNIX и по-прежнему должны использовать Ruby 1.8 (без SecureRandom) без Rails, вы также можете использовать это:

random_string = `openssl rand -base64 24`

Обратите внимание, это порождает новую оболочку, она очень медленная и может быть рекомендована только для скриптов.

2 голосов
/ 18 сентября 2008

Мне кажется, мне больше всего нравится ответ Радара. Я бы немного подправил так:

CHARS = ('a'..'z').to_a + ('A'..'Z').to_a
def rand_string(length=8)
  s=''
  length.times{ s << CHARS[rand(CHARS.length)] }
  s
end
2 голосов
/ 18 сентября 2008

С помощью этого метода вы можете перейти в произвольную длину. По умолчанию установлено значение 6.

def generate_random_string(length=6)
  string = ""
  chars = ("A".."Z").to_a
  length.times do
    string << chars[rand(chars.length-1)]
  end
  string
end
2 голосов
/ 11 февраля 2012

Мой лучший выстрел, 2 решения для случайной строки, состоящей из 3 диапазонов

(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join

([*(48..57),*(65..90),*(97..122)]).sample(8).collect(&:chr)*""
2 голосов
/ 18 августа 2014

Еще один трюк, который работает с Ruby 1.8+ и быстрый:

>> require "openssl"
>> OpenSSL::Random.random_bytes(20).unpack('H*').join
=> "2f3ff53dd712ba2303a573d9f9a8c1dbc1942d28"

Это случайная шестнадцатеричная строка. Аналогичным образом вы сможете генерировать строку base64 ('M *').

1 голос
/ 19 мая 2016

Для устройства secure_validatable вы можете использовать это

(0 ... 8) .map {([65, 97] .sample + rand (26)). Chr} .push (rand (99)). Join

1 голос
/ 24 февраля 2016
10.times do 
  alphabet = ('a'..'z').to_a
  string += alpha[rand(alpha.length)]
end
1 голос
/ 24 апреля 2012

Это основано на нескольких других ответах, но добавляет немного больше сложности:

def random_password
  specials = ((32..47).to_a + (58..64).to_a + (91..96).to_a + (123..126).to_a).pack('U*').chars.to_a
  numbers  = (0..9).to_a
  alpha    = ('a'..'z').to_a + ('A'..'Z').to_a
  %w{i I l L 1 O o 0}.each{ |ambiguous_character| 
    alpha.delete ambiguous_character 
  }
  characters = (alpha + specials + numbers)
  password = Random.new.rand(8..18).times.map{characters.sample}
  password << specials.sample unless password.join =~ Regexp.new(Regexp.escape(specials.join))
  password << numbers.sample  unless password.join =~ Regexp.new(Regexp.escape(numbers.join))
  password.shuffle.join
end

По сути, он обеспечивает пароль длиной от 8 до 20 символов, который содержит как минимум одно число и один специальный символ.

0 голосов
/ 08 августа 2018

Вот улучшение ответа @Travis R:

 def random_string(length=5)
    chars = 'abdefghjkmnpqrstuvwxyzABDEFGHJKLMNPQRSTUVWXYZ'
    numbers = '0123456789'
    random_s = ''
    (length/2).times { random_s << numbers[rand(numbers.size)] }
    (length - random_s.length).times { random_s << chars[rand(chars.size)] }
    random_s.split('').shuffle.join
  end

В @Travis R символы ответа и числа были вместе, поэтому иногда random_string может возвращать только цифры или только символы. С этим улучшением по крайней мере половина из random_string будет символами, а остальные числа. На всякий случай, если вам нужна случайная строка с цифрами и символами

0 голосов
/ 18 сентября 2008

Я не знаю ruby, поэтому не могу дать вам точный синтаксис, но я бы установил постоянную строку со списком допустимых символов, а затем использовал оператор подстроки, чтобы выбрать из него случайный символ.

Преимущество здесь в том, что если предполагается, что строка вводится пользователем, вы можете исключить легко перепутанные символы, такие как l и 1 и i, 0 и O, 5 и S и т. Д.

...