Permalink
Browse files

Add SecureRandom.base58

  • Loading branch information...
guilleiguaran committed Jan 9, 2015
1 parent 82dd93b commit b1093977110f18ae0cafe56c3d99fc22a7d54d1b
@@ -1,3 +1,7 @@
* Add `SecureRandom.base58` for generation of random base58 strings.
*Matthew Draper + Guillermo Iguaran*
* Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
`#tomorrow` for `Date`, `Time`, and `DateTime`.
@@ -0,0 +1,21 @@
module SecureRandom
BASE58_ALPHABET = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a - ['0', 'O', 'I', 'l']
# SecureRandom.base58 generates a random base58 string.
#
# The argument _n_ specifies the length, of the random string to be generated.
#
# If _n_ is not specified or is nil, 16 is assumed. It may be larger in the future.
#
# The result may contain alphanumeric characters except 0, O, I and l
#
# p SecureRandom.base58 #=> "4kUgL2pdQMSCQtjE"
# p SecureRandom.base58(24) #=> "77TMHrHJFvFDwodq8w7Ev2m7"
#
def self.base58(n = 16)
SecureRandom.random_bytes(n).unpack("C*").map do |byte|
idx = byte % 64
idx = SecureRandom.random_number(58) if idx >= 58
BASE58_ALPHABET[idx]
end.join
end
end
@@ -0,0 +1,20 @@
require 'abstract_unit'
require 'active_support/core_ext/securerandom'
class SecureRandomTest < ActiveSupport::TestCase
def test_base58
s1 = SecureRandom.base58
s2 = SecureRandom.base58
assert_not_equal s1, s2
assert_equal 16, s1.length
end
def test_base58_with_length
s1 = SecureRandom.base58(24)
s2 = SecureRandom.base58(24)
assert_not_equal s1, s2
assert_equal 24, s1.length
end
end

0 comments on commit b109397

Please sign in to comment.