Skip to content

Commit

Permalink
Add SecureRandom.base58
Browse files Browse the repository at this point in the history
  • Loading branch information
guilleiguaran committed Jan 9, 2015
1 parent 82dd93b commit b109397
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
4 changes: 4 additions & 0 deletions activesupport/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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`.

Expand Down
21 changes: 21 additions & 0 deletions activesupport/lib/active_support/core_ext/securerandom.rb
Original file line number Diff line number Diff line change
@@ -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
20 changes: 20 additions & 0 deletions activesupport/test/core_ext/securerandom.rb
Original file line number Diff line number Diff line change
@@ -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.