When you need to generate a random alphanumeric string of a specified length in ruby you have a couple of options.
If you are using Ruby version >= 2.5 you can simply go with:
SecureRandom.alphanumeric(length)
For older versions you can utilize a little numeric convertion hack: Integer#to_s
method accepts an argument representing the base.
For example:
13.to_s(2) # => "1101" in binary
13.to_s(16) # => "d" in hex
def alphanumerical_code(length)
# 36 is used here as base: we want 10 digits plus 26 letters
(36 ** (length - 1) + rand(36 ** length - 36 ** (length - 1))).to_s(36)
end
def digital_code(length)
(10 ** (length - 1) + rand(10 ** length - 10 ** (length - 1))).to_s(10)
end
More custom generator
In case if you need to build something more specific and have more control, you can create your own generator.
Let's say we need a random alphanumeric string generator, which excludes some of the letters, so the strings are more easily distinguished by customer in printed media.
class Generator
CHARSET = [('0'..'9'), ('a'..'z'), ('A'..'Z')]
def initialize(length:, exceptions: [])
@length = length
@allowed_charset = CHARSET.flat_map(&:to_a) - exceptions
end
def perform
(0...@length)
.map { @allowed_charset[rand(@allowed_charset.size)] }
.join
end
end
generator = Generator.new(
length: 10,
exceptions: ['1', 'I', 'l', '0', 'o', 'O']
)
generator.perform
(1..3).map { better_generator.perform }
# => ["FXCpz9evUj", "JP3uGhF35i", "rP4wv8Q5rm"]