Сгенерировать случайную строку и сохранить в файл

#ruby #file #random #save

#ruby #файл #Случайный #Сохранить

Вопрос:

Я застрял в выполнении такой простой программы на Ruby, которая генерирует случайную строку длиной 63 символа, а затем сохраняет ее в текстовом файле. На данный момент мой код :

 def Password_Generator(length=63)
  chars = ("a".."z").to_a   ("A".."Z").to_a   ("0".."9").to_a
  password = ''
  length.time { |i| password << chars[rand(chars.length)] }
  aFile = File.new("Generated-Password.txt", "w ")
  aFile.write(password)
  aFile.close
end
  

Ответ №1:

Во-первых, Password_Generator это неправильное имя метода в Ruby, поскольку константы используются для имен классов. Также разработчики Ruby предпочитают snake_case над camelCase. Для вашего фактического вопроса (это Ruby 1.9):

 def generate_password(length=63)
  chars = [*?a..?z, *?A..?Z, *0..9]
  (1..length).map{ chars.sample }.join
end
  

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

Комментарии:

1. Вау, я действительно не понимаю этот способ генерации случайных строк Oo! Никогда не видел этого *?a. Не могли бы вы опубликовать функцию записи файла? Спасибо за быстрый ответ!

2. для записи в файл используйте File.open("generated-password.txt','w '){|w| w.write generate_password }

3. Я протестировал это, и это сработало! Большое спасибо вам двоим за помощь! И спасибо вам за *? способ генерации случайных чисел!

4. * в этом контексте оператор splat ( [*1..3] #=> [1, 2, 3] ) . ?a является символьным литералом, поэтому мы разделяем диапазон символов ( [*?a..?e] #=> ["a", "b", "c", "d", "e"] ). @Jacob показал вам способ записи в файл.

5. Рад помочь. Кстати: если это был ответ, который вы искали, пожалуйста, примите его, чтобы другие люди знали, что на него был дан достаточный ответ. Это считается хорошей практикой здесь, при переполнении стека.

Ответ №2:

 require 'securerandom'
def generate_password(length=63)
  # urlsafe_base64 uses lowercase, uppercase, 1-9 and _-. 
  # The latter are removed from the generated string.
  SecureRandom.urlsafe_base64(length).delete('_-')[0, length]
end

File.open('pwd.txt', 'w'){|f| f.puts generate_password}