[#9382] the sign of a number is omitted when squaring it. -2**2 vs (-2)**2 — <noreply@...>

Bugs item #6468, was opened at 2006-11-03 17:25

9 messages 2006/11/03

[#9385] merge YARV into Ruby — SASADA Koichi <ko1@...>

Hi,

42 messages 2006/11/04
[#9405] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/4/06, SASADA Koichi <ko1@atdot.net> wrote:

[#9406] Re: merge YARV into Ruby — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/06

On Monday 06 November 2006 16:01, Kirill Shutemov wrote:

[#9417] Re: merge YARV into Ruby — Sean Russell <ser@...> 2006/11/06

On Monday 06 November 2006 10:15, Sylvain Joyeux wrote:

[#9428] Re: merge YARV into Ruby — "Kirill Shutemov" <k.shutemov@...> 2006/11/06

On 11/6/06, Sean Russell <ser@germane-software.com> wrote:

[#9402] fast mutexes for 1.8? — MenTaLguY <mental@...>

Many people have been using Thread.critical for locking because Ruby

24 messages 2006/11/06

[#9450] Bikeshed: No more Symbol < String? — Kornelius Kalnbach <murphy@...>

Hi ruby-core!

21 messages 2006/11/07
[#9452] Re: Bikeshed: No more Symbol < String? — Yukihiro Matsumoto <matz@...> 2006/11/07

Hi,

[#9493] Future Plans for Ruby 1.8 Series — URABE Shyouhei <shyouhei@...>

This week Japanese rubyists were talking about the future of ruby_1_8

13 messages 2006/11/09

[#9515] External entropy pool for random number generator — "Kirill Shutemov" <k.shutemov@...>

In the attachment patch which allow to use external entropy pool for

13 messages 2006/11/11
[#9522] Re: External entropy pool for random number generator — "Nobuyoshi Nakada" <nobu@...> 2006/11/13

Hi,

[#9554] Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...>

I've been thinking about how version numbers are restricting what we can do.

30 messages 2006/11/16
[#9561] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

[#9563] Re: Ruby 1.[89].\d+ and beyond. — Hugh Sasse <hgs@...> 2006/11/16

On Fri, 17 Nov 2006, Eric Hodel wrote:

[#9564] Re: Ruby 1.[89].\d+ and beyond. — Eric Hodel <drbrain@...7.net> 2006/11/16

On Nov 16, 2006, at 12:02 PM, Hugh Sasse wrote:

[#9571] Re: Ruby 1.[89].\d+ and beyond. — "Robert Dober" <robert.dober@...> 2006/11/19

On 11/16/06, Eric Hodel <drbrain@segment7.net> wrote:

[#9604] #ancestors never includes the singleton class (inconsistent) — <noreply@...>

Bugs item #6820, was opened at 2006-11-22 08:49

12 messages 2006/11/22
[#9618] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Yukihiro Matsumoto <matz@...> 2006/11/25

Hi,

[#9629] Re: [ ruby-Bugs-6820 ] #ancestors never includes the singleton class (inconsistent) — Sylvain Joyeux <sylvain.joyeux@...4x.org> 2006/11/27

> It is supposed to. Singleton classes (or eigenclasses, if you want to

External entropy pool for random number generator

From: "Kirill Shutemov" <k.shutemov@...>
Date: 2006-11-11 16:01:17 UTC
List: ruby-core #9515
In the attachment patch which allow to use external entropy pool for
Kernel::rand.

When entropy pool present and you run Kernel::rand it reads 4(should
be more?) bytes from pool and use this value as random seed. When pool
ends(EOF reached) it sets to nil.

It can be useful for cryptography or for testing. For example:

srand(File.open("/dev/random")) # use system entropy pool
rand
srand # use standart ruby's generator

Attachments (1)

random.patch (1.98 KB, text/x-diff)
Index: test/ruby/test_rand.rb
===================================================================
--- test/ruby/test_rand.rb	(revision 581)
+++ test/ruby/test_rand.rb	(working copy)
@@ -128,4 +128,12 @@
     ws.each {|w| assert_equal(w.to_i, rand(-0x10000)) }
   end
 
+  def test_pool
+    ws = %w(47614 8758 37572 57322 56974)
+    pool_rd, pool_wr = IO.pipe
+    pool_wr << "a test pool"
+    pool_wr.close
+    srand(pool_rd)
+    ws.each {|w| assert_equal(w.to_i, rand(0x10000))}
+  end
 end
Index: random.c
===================================================================
--- random.c	(revision 581)
+++ random.c	(working copy)
@@ -189,8 +189,9 @@
 #endif
 
 static VALUE saved_seed = INT2FIX(0);
+static VALUE entropy_pool = Qnil;
 
-static VALUE
+static void
 rand_init(VALUE vseed)
 {
     volatile VALUE seed;
@@ -242,10 +243,8 @@
             len--;
         init_by_array(buf, len);
     }
-    old = saved_seed;
     saved_seed = seed;
     free(buf);
-    return old;
 }
 
 static VALUE
@@ -321,10 +320,17 @@
     VALUE seed, old;
 
     rb_secure(4);
-    if (rb_scan_args(argc, argv, "01", &seed) == 0) {
+    if (rb_scan_args(argc, argv, "01", &seed) == 0)
 	seed = random_seed();
+
+    old = saved_seed;
+
+    if (rb_respond_to(seed, rb_intern("read")))
+	entropy_pool = seed;
+    else{
+	rand_init(seed);
+	entropy_pool = Qnil;
     }
-    old = rand_init(seed);
 
     return old;
 }
@@ -432,9 +438,26 @@
 rb_f_rand(int argc, VALUE *argv, VALUE obj)
 {
     VALUE vmax;
+    VALUE seed;
     long val, max;
 
     rb_scan_args(argc, argv, "01", &vmax);
+
+    if (RTEST(entropy_pool)){
+	seed = rb_funcall(entropy_pool, rb_intern("read"), 1, INT2FIX(4));
+
+	if (RTEST(seed)){
+	    seed = rb_funcall(seed, rb_intern("unpack"), 1, rb_str_new2("L"));
+	    seed = rb_ary_entry(seed, 0);
+	}
+
+	if (RTEST(seed))
+	    rand_init(seed);
+	else
+	    entropy_pool = Qnil;
+    }
+
+
     switch (TYPE(vmax)) {
       case T_FLOAT:
 	if (RFLOAT(vmax)->value <= LONG_MAX && RFLOAT(vmax)->value >= LONG_MIN) {

In This Thread

Prev Next