Генерация уникальной случайной строки с буквами и цифрами в нижнем регистре - PullRequest
34 голосов
/ 11 мая 2011

Как я могу исправить этот код, чтобы он генерировал уникальные случайные буквы и цифры в нижнем регистре?

api_string = (0...32).map{65.+(rand(25)).chr}.join    

На данный момент генерирует только буквы.

Ответы [ 11 ]

83 голосов
/ 11 мая 2011

Если вы используете 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"
26 голосов
/ 11 мая 2011

Все буквы и цифры, вот как числа представлены в базе 36.

api_string = Array.new(32){rand(36).to_s(36)}.join
16 голосов
/ 07 мая 2015

8.times.map { [*'0'..'9', *'a'..'z'].sample }.join

2 голосов
/ 22 августа 2013

я забыл откуда, но я как-то читал это сегодня утром

l,m = 24,36
rand(m**l).to_s(m).rjust(l,'0')

оно создает случайное число от 0 до степени (36,24), а затем преобразует его в строку base-36 (что0-9 и az)

2 голосов
/ 11 мая 2011

Вот один из способов сделать это:

POSSIBLE = (('A'..'Z').to_a + (0..9).to_a)
api_string = (0...32).map { |n| POSSIBLE.sample }.join

Если у вас есть Active Support, вы также можете сделать это, чтобы получить строку, подобную ключу API:

ActiveSupport::SecureRandom.hex(32)
1 голос
/ 06 декабря 2018

Будет сгенерирована нижняя случайная строка из 32-50 символов, включая цифры и буквы, оба:

require 'string_pattern'

puts "32-50:/xN/".gen
1 голос
/ 29 сентября 2013
((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join

Замените rand(100) на rand(n), где n - максимальная длина желаемой строки.

1 голос
/ 11 мая 2011
CHARS = (?0..?9).to_a + (?a..?z).to_a
api_string = 32.times.inject("") {|s, i| s << CHARS[rand(CHARS.size)]}
0 голосов
/ 26 декабря 2018

Более новые версии Ruby поддерживают SecureRandom.base58 , что даст вам более плотные токены, чем шестнадцатеричные, без каких-либо специальных символов.

> SecureRandom.base58(24)
> "Zp9N4aYvQfz3E6CmEzkadoa2" 
0 голосов
/ 14 июля 2016
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...