diff --git a/lib/securerandom.rb b/lib/securerandom.rb index 476f5e1..f04c6e2 100644 --- a/lib/securerandom.rb +++ b/lib/securerandom.rb @@ -297,4 +297,23 @@ module SecureRandom ary[3] = (ary[3] & 0x3fff) | 0x8000 "%08x-%04x-%04x-%04x-%04x%08x" % ary end + + # SecureRandom.alphanumeric generates a random alphanumeric string. + # + # The argument _n_ specifies the length, in bytes, of the random number + # to be generated. The length of the result string is about 4/3 of _n_. + # + # If _n_ is not specified or is nil, 16 is assumed. + # It may be larger in the future. + # + # The result may contain A-Z, a-z and 0-9. + # + # p SecureRandom.alphanumeric #=> "2BuBuLf3WfSKyQbRccA" + # p SecureRandom.alphanumeric #=> "6BbW0pxO0YENxn38HMUbcQ" + # + # If a secure random number generator is not available, + # +NotImplementedError+ is raised. + def self.alphanumeric(n=nil) + [random_bytes(n)].pack("m*").delete("\n+/=") + end end diff --git a/test/test_securerandom.rb b/test/test_securerandom.rb index 0a78624..d49d579 100644 --- a/test/test_securerandom.rb +++ b/test/test_securerandom.rb @@ -164,6 +164,13 @@ end end end + def test_alphanumeric + 65.times do |idx| + an = @it.alphanumeric + assert_match(/^[0-9a-zA-Z]+$/, an) + end + end + def protect begin yield