Как я могу исправить этот код, чтобы он генерировал уникальные случайные буквы и цифры в нижнем регистре?
api_string = (0...32).map{65.+(rand(25)).chr}.join
В настоящий момент он генерирует только буквы.
Как я могу исправить этот код, чтобы он генерировал уникальные случайные буквы и цифры в нижнем регистре?
api_string = (0...32).map{65.+(rand(25)).chr}.join
В настоящий момент он генерирует только буквы.
Если вы используете ruby 1.9.2, вы можете использовать SecureRandom:
irb(main):001:0> require 'securerandom'
=> true
irb(main):002:0> SecureRandom.hex(13)
=> "5bbf194bcf8740ae8c9ce49e97"
irb(main):003:0> SecureRandom.hex(15)
=> "d2413503a9618bacfdb1745eafdb0f"
irb(main):004:0> SecureRandom.hex(32)
=> "432e0a359bbf3669e6da610d57ea5d0cd9e2fceb93e7f7989305d89e31073690"
Все буквы и цифры, как номера представлены в базе 36.
api_string = Array.new(32){rand(36).to_s(36)}.join
8.times.map { [*'0'..'9', *'a'..'z'].sample }.join
Вот один из способов сделать это:
POSSIBLE = (('A'..'Z').to_a + (0..9).to_a)
api_string = (0...32).map { |n| POSSIBLE.sample }.join
Если у вас есть активная поддержка, вы также можете сделать это, чтобы создать строку, подобную API-интерфейсу:
ActiveSupport::SecureRandom.hex(32)
я забыл, откуда, но я прочитал это как-то сегодня утром
l,m = 24,36
rand(m**l).to_s(m).rjust(l,'0')
он создает случайное число от 0 до мощности (36,24), затем преобразует его в строку base-36 (то есть 0-9 и a-z)
CHARS = (?0..?9).to_a + (?a..?z).to_a
api_string = 32.times.inject("") {|s, i| s << CHARS[rand(CHARS.size)]}
((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join
Замените rand(100)
на rand(n)
, где n
- максимальная длина вашей нужной строки.
используя SecureRandom из рубинового языка.
require 'securerandom' randomstring = SecureRandom.hex(5)
Он будет генерировать случайную строку n * 2, содержащую "0-9" и "a-f"
Это создаст более низкую случайную строку от 32 до 50 символов, включая числа и буквы, причем оба:
require 'string_pattern'
puts "32-50:/xN/".gen
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)