diff --git a/lib/random/formatter.rb b/lib/random/formatter.rb
index 744853a4b7..4dea61c16c 100644
--- a/lib/random/formatter.rb
+++ b/lib/random/formatter.rb
@@ -1,9 +1,14 @@
# -*- coding: us-ascii -*-
# frozen_string_literal: true
-# == Random number formatter.
+# == \Random number formatter.
#
-# Formats generated random numbers in many manners.
+# Formats generated random numbers in many manners. When 'random/formatter'
+# is required, several methods are added to empty core module Random::Formatter,
+# making them available as Random's instance and module methods.
+#
+# Standard library SecureRandom is also extended with the module, and the methods
+# described below are available as a module methods in it.
#
# === Examples
#
@@ -11,34 +16,45 @@
#
# require 'random/formatter'
#
+# prng = Random.new
# prng.hex(10) #=> "52750b30ffbc7de3b362"
# prng.hex(10) #=> "92b15d6c8dc4beb5f559"
# prng.hex(13) #=> "39b290146bea6ce975c37cfc23"
+# # or just
+# Random.hex #=> "1aed0c631e41be7f77365415541052ee"
#
# Generate random base64 strings:
#
# prng.base64(10) #=> "EcmTPZwWRAozdA=="
# prng.base64(10) #=> "KO1nIU+p9DKxGg=="
# prng.base64(12) #=> "7kJSM/MzBJI+75j8"
+# Random.base64(4) #=> "bsQ3fQ=="
#
# Generate random binary strings:
#
# prng.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
# prng.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"
+# Random.random_bytes(6) #=> "\xA1\xE6Lr\xC43"
#
# Generate alphanumeric strings:
#
# prng.alphanumeric(10) #=> "S8baxMJnPl"
# prng.alphanumeric(10) #=> "aOxAg8BAJe"
+# Random.alphanumeric #=> "TmP9OsJHJLtaZYhP"
#
# Generate UUIDs:
#
# prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
# prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"
+# Random.uuid #=> "f14e0271-de96-45cc-8911-8910292a42cd"
+#
+# All methods are available in the standard library SecureRandom, too:
+#
+# SecureRandom.hex #=> "05b45376a30c67238eb93b16499e50cf"
module Random::Formatter
- # Random::Formatter#random_bytes generates a random binary string.
+ # Generate a random binary string.
#
# The argument _n_ specifies the length of the result string.
#
@@ -49,14 +65,16 @@ module Random::Formatter
#
# require 'random/formatter'
#
- # prng.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6"
+ # Random.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6"
+ # # or
+ # prng = Random.new
# prng.random_bytes #=> "m\xDC\xFC/\a\x00Uf\xB2\xB2P\xBD\xFF6S\x97"
def random_bytes(n=nil)
n = n ? n.to_int : 16
gen_random(n)
end
- # Random::Formatter#hex generates a random hexadecimal string.
+ # Generate a random hexadecimal string.
#
# The argument _n_ specifies the length, in bytes, of the random number to be generated.
# The length of the resulting hexadecimal string is twice of _n_.
@@ -68,13 +86,15 @@ module Random::Formatter
#
# require 'random/formatter'
#
- # prng.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"
+ # Random.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"
+ # # or
+ # prng = Random.new
# prng.hex #=> "91dc3bfb4de5b11d029d376634589b61"
def hex(n=nil)
random_bytes(n).unpack1("H*")
end
- # Random::Formatter#base64 generates a random base64 string.
+ # Generate a random base64 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_.
@@ -86,7 +106,9 @@ module Random::Formatter
#
# require 'random/formatter'
#
- # prng.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A=="
+ # Random.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A=="
+ # # or
+ # prng = Random.new
# prng.base64 #=> "6BbW0pxO0YENxn38HMUbcQ=="
#
# See RFC 3548 for the definition of base64.
@@ -94,7 +116,7 @@ module Random::Formatter
[random_bytes(n)].pack("m0")
end
- # Random::Formatter#urlsafe_base64 generates a random URL-safe base64 string.
+ # Generate a random URL-safe base64 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_.
@@ -112,7 +134,9 @@ module Random::Formatter
#
# require 'random/formatter'
#
- # prng.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg"
+ # Random.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg"
+ # # or
+ # prng = Random.new
# prng.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg"
#
# prng.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ=="
@@ -126,12 +150,14 @@ module Random::Formatter
s
end
- # Random::Formatter#uuid generates a random v4 UUID (Universally Unique IDentifier).
+ # Generate a random v4 UUID (Universally Unique IDentifier).
#
# require 'random/formatter'
#
- # prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
- # prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"
+ # Random.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
+ # Random.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"
+ # # or
+ # prng = Random.new
# prng.uuid #=> "62936e70-1815-439b-bf89-8492855a7e6b"
#
# The version 4 UUID is purely random (except the version).
@@ -139,7 +165,7 @@ module Random::Formatter
#
# The result contains 122 random bits (15.25 random bytes).
#
- # See RFC 4122 for details of UUID.
+ # See RFC4122[https://datatracker.ietf.org/doc/html/rfc4122] for details of UUID.
#
def uuid
ary = random_bytes(16).unpack("NnnnnN")
@@ -152,7 +178,7 @@ module Random::Formatter
self.bytes(n)
end
- # Random::Formatter#choose generates a string that randomly draws from a
+ # Generate a string that randomly draws from a
# source array of characters.
#
# The argument _source_ specifies the array of characters from which
@@ -196,7 +222,7 @@ module Random::Formatter
end
ALPHANUMERIC = [*'A'..'Z', *'a'..'z', *'0'..'9']
- # Random::Formatter#alphanumeric generates a random alphanumeric string.
+ # Generate a random alphanumeric string.
#
# The argument _n_ specifies the length, in characters, of the alphanumeric
# string to be generated.
@@ -208,7 +234,9 @@ module Random::Formatter
#
# require 'random/formatter'
#
- # prng.alphanumeric #=> "2BuBuLf3WfSKyQbR"
+ # Random.alphanumeric #=> "2BuBuLf3WfSKyQbR"
+ # # or
+ # prng = Random.new
# prng.alphanumeric(10) #=> "i6K93NdqiH"
def alphanumeric(n=nil)
n = 16 if n.nil?
diff --git a/random.c b/random.c
index 759e15335a..4b5b7ab6c4 100644
--- a/random.c
+++ b/random.c
@@ -1803,6 +1803,9 @@ rb_reset_random_seed(void)
* PRNGs are currently implemented as a modified Mersenne Twister with a period
* of 2**19937-1. As this algorithm is _not_ for cryptographical use, you must
* use SecureRandom for security purpose, instead of this PRNG.
+ *
+ * See also Random::Formatter module that adds convenience methods to generate
+ * various forms of random data.
*/
void