generate random string in ruby
Sometimes we need to generate a ‘n’ character random string.
Here are a few:
- Only upper case alphabets [A-Z]
value = "";
8.times{value << (65 + rand(25)).chr} >>}
#or
(0...8).map{65.+(rand(26)).chr}.join
(0...8).map{ ('A'..'Z').to_a[rand(26)] }.join
- Lower case and upper case [a-zA-Z]
value = "";
8.times{value << ((rand(2)==1?65:97) + rand(25)).chr} >>}
#or
o = [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
string = (0...50).map{ o[rand(o.length)] }.join
- Using SecureRandom provided by ActiveSupport
require 'active_support/secure_random'
random_string = ActiveSupport::SecureRandom.hex(16)
# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81
- SecureRandom also has methods for:
base64
- hex
- random_bytes
- random_number
- It is also important to avoid Ambiguity
# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
(0...size).map{ charset.to_a[rand(charset.size)] }.join
end
- Random URL Friendly Strings
rand(36**length).to_s(36)
- One more example with SecureRandom
require 'securerandom'
s = SecureRandom.urlsafe_base64(20)
- Creating a Random string with arguments
def random_string(length=10)
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'
password = ''
length.times { password << chars[rand(chars.size)] }
password
end
- This example works Only in ruby 1.9
[*('A'..'Z')].sample(8).join
#Generate a random 8 letter string (e.g. NVAYXHGR)
([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(8).join
#Generate a random 8 character string (e.g. 3PH4SWF2), excludes 0/1/I/O. Ruby 1.9
ALPHABET = ('a'..'z').to_a
10.times.map{ ALPHABET.sample }.join
10.times.inject(''){|s| s << ALPHABET.sample }
- Here’s one using digest sha1
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]
-
Here are more examples to help
-
Example 1
rand(2**256).to_s(36)[0..7]
#Add ljust if you are really paranoid about the correct string length:
rand(2**256).to_s(36).ljust(8,'a')[0..7]
characters = ('a'..'z').to_a + ('A'..'Z').to_a
# Prior to 1.9, use .choice, not .sample
(0..8).map{characters.sample}.join
(0...8).collect { |n| value << (65 + rand(25)).chr }.join()
- Example 2
def generate_random_string(length=6)
string = ""
chars = ("A".."Z").to_a
length.times do
string << chars[rand(chars.length-1)]
end
string
end
- Example 3
chars = [*('a'..'z'),*('0'..'9')].flatten #Single expression, can be passed as an argument, allows duplicate characters: Array.new(len) {|i| chars.sample}.join
- Example 4
def token(length=16)
chars = [*('A'..'Z'), *('a'..'z'), *(0..9)]
(0..length).map {chars.sample}.join
end
- Example 5
''.tap {|v| 4.times { v << ('a'..'z').to_a.sample} }
-
Example 6 ```ruby class String
def self.random(length=10) (‘a’..’z’).sort_by {rand}[0,length].join end
end
- Example 7
```ruby
(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join
([(48..57),(65..90),(97..122)]).sample(8).collect{|x|x.chr}""
- Example 8
def secure_random_string(length = 32, non_ambiguous = false) characters = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a %w{I O l 0 1}.each{ |ambiguous_character| characters.delete ambiguous_character } if non_ambiguous (0...length).map{ characters[ActiveSupport::SecureRandom.random_number(characters.size)] }.join end
- Example 9
SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz') # ruby 1.8 and unix random_string = `openssl rand -base64 24`