Как сгенерировать случайную строку в 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 ]

13 голосов
/ 29 сентября 2014

Array.new(n){[*"0".."9"].sample}.join, где n = 8 в вашем случае.

Обобщено: Array.new(n){[*"A".."Z", *"0".."9"].sample}.join и т. Д. - из это ответ

11 голосов
/ 18 сентября 2008
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]
10 голосов
/ 19 ноября 2014

Вот простой код для случайной строки длиной 8

.
 random_string = ('0'..'z').to_a.shuffle.first(8).join

Вы также можете использовать его для произвольного пароля длиной 8

random_password = ('0'..'z').to_a.shuffle.first(8).join

Я надеюсь, что это поможет и удивительно.

10 голосов
/ 25 июля 2010

Рубин 1.9 +:

ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"

# or

10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"
8 голосов
/ 30 марта 2013

Имейте в виду: rand предсказуемо для атакующего и, следовательно, вероятно, небезопасно. Вы обязательно должны использовать SecureRandom, если это для генерации паролей. Я использую что-то вроде этого:

length = 10
characters = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a

password = SecureRandom.random_bytes(length).each_char.map do |char|
  characters[(char.ord % characters.length)]
end.join
8 голосов
/ 15 октября 2012

Вот один простой код для случайного пароля с длиной 8

rand_password=('0'..'z').to_a.shuffle.first(8).join

Надеюсь, это поможет.

6 голосов
/ 09 января 2010

Другой метод, который мне нравится использовать

 rand(2**256).to_s(36)[0..7]

Добавьте просто, если вы действительно параноик по поводу правильной длины строки:

 rand(2**256).to_s(36).ljust(8,'a')[0..7]
6 голосов
/ 19 апреля 2012
SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')

Что-то от Devise

5 голосов
/ 23 августа 2014

вы можете использовать String#random из Граней Рубинового Камня facets:

https://github.com/rubyworks/facets/blob/126a619fd766bc45588cac18d09c4f1927538e33/lib/core/facets/string/random.rb

это в основном делает это:

class String
  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    characters = character_set.map { |i| i.to_a }.flatten
    characters_len = characters.length
    (0...len).map{ characters[rand(characters_len)] }.join
  end
end
5 голосов
/ 27 мая 2012

Просто добавляю мои центы сюда ...

def random_string(length = 8)
  rand(32**length).to_s(32)
end
...