Project

General

Profile

Actions

Feature #4938

closed

Add Random.bytes [patch]

Added by marcandre (Marc-Andre Lafortune) over 13 years ago. Updated almost 7 years ago.

Status:
Closed
Target version:
-
[ruby-core:37576]

Description

It could be useful to add a Random.bytes method (equivalent to Random::DEFAULT.bytes), as per the simple patch attached.


Files

randombytes.diff (2.19 KB) randombytes.diff marcandre (Marc-Andre Lafortune), 06/28/2011 12:58 AM
randombytes-ruby22.diff (2.38 KB) randombytes-ruby22.diff hsbt (Hiroshi SHIBATA), 10/29/2014 05:37 AM
Actions #1

Updated by shyouhei (Shyouhei Urabe) over 12 years ago

  • Status changed from Open to Assigned

Updated by marcandre (Marc-Andre Lafortune) about 12 years ago

Comment about this trivial feature would be appreciated.

Updated by mrkn (Kenta Murata) about 12 years ago

  • Target version changed from 2.0.0 to 2.6

I think it is useful and acceptable to introduce, but 2.0 is already frozen about its features, so the target version should be next-minor.

Updated by hsbt (Hiroshi SHIBATA) about 10 years ago

  • File randombytes-ruby22.diff added

I update this patch on Ruby 2.2.

Updated by marcandre (Marc-Andre Lafortune) about 10 years ago

Hi Nobu,
is there a reason not to commit this?

Updated by nobu (Nobuyoshi Nakada) about 10 years ago

  • Assignee changed from nobu (Nobuyoshi Nakada) to normalperson (Eric Wong)

I think there is no problems.

Updated by hsbt (Hiroshi SHIBATA) about 10 years ago

  • File deleted (randombytes-ruby22.diff)

Updated by normalperson (Eric Wong) about 10 years ago

wrote:

File randombytes-ruby22.diff added

Looks good to me.
Any approval from matz since this is a new API?

Updated by normalperson (Eric Wong) about 10 years ago

  • Assignee changed from normalperson (Eric Wong) to matz (Yukihiro Matsumoto)

Any comment from matz for API addition?

Actions #11

Updated by naruse (Yui NARUSE) almost 7 years ago

  • Target version deleted (2.6)

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago

Updated.

diff --git i/random.c w/random.c
index 43a3d2ffee..b800f1d9a1 100644
--- i/random.c
+++ w/random.c
@@ -1134,6 +1134,19 @@ rb_random_bytes(VALUE obj, long n)
     return genrand_bytes(rnd, n);
 }
 
+/*
+ * call-seq: Random.bytes(size) -> a_string
+ *
+ * Returns a random binary string.  The argument size specified the length of
+ * the result string.
+ */
+static VALUE
+random_s_bytes(VALUE obj, VALUE len)
+{
+    rb_random_t *rnd = rand_start(&default_rand);
+    return genrand_bytes(rnd, NUM2LONG(rb_to_int(len)));
+}
+
 static VALUE
 range_values(VALUE vmax, VALUE *begp, VALUE *endp, int *exclp)
 {
@@ -1636,6 +1649,7 @@ InitVM_Random(void)
 
     rb_define_singleton_method(rb_cRandom, "srand", rb_f_srand, -1);
     rb_define_singleton_method(rb_cRandom, "rand", random_s_rand, -1);
+    rb_define_singleton_method(rb_cRandom, "bytes", random_s_bytes, 1);
     rb_define_singleton_method(rb_cRandom, "new_seed", random_seed, 0);
     rb_define_singleton_method(rb_cRandom, "urandom", random_raw_seed, 1);
     rb_define_private_method(CLASS_OF(rb_cRandom), "state", random_s_state, 0);
diff --git i/test/ruby/test_rand.rb w/test/ruby/test_rand.rb
index 882d33fb40..136ee4f912 100644
--- i/test/ruby/test_rand.rb
+++ w/test/ruby/test_rand.rb
@@ -347,10 +347,15 @@
   end
 
   def assert_random_bytes(r)
+    srand(0)
     assert_equal("", r.bytes(0))
-    assert_equal("\xAC".force_encoding("ASCII-8BIT"), r.bytes(1))
-    assert_equal("/\xAA\xC4\x97u\xA6\x16\xB7\xC0\xCC".force_encoding("ASCII-8BIT"),
-                 r.bytes(10))
+    assert_equal("", Random.bytes(0))
+    x = "\xAC".force_encoding("ASCII-8BIT")
+    assert_equal(x, r.bytes(1))
+    assert_equal(x, Random.bytes(1))
+    x = "/\xAA\xC4\x97u\xA6\x16\xB7\xC0\xCC".force_encoding("ASCII-8BIT")
+    assert_equal(x, r.bytes(10))
+    assert_equal(x, Random.bytes(10))
   end
 
   def test_random_range

Updated by matz (Yukihiro Matsumoto) almost 7 years ago

Accepted. Better later than never.

Matz.

Actions #14

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r62497.


random.c: Random.bytes

  • random.c (random_s_bytes): new method Random.bytes, which is
    equivalent to Random::DEFAULT.bytes. [Feature #4938]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0