とみたです。

On Thu, 28 Jul 2011 02:13:07 +0900
とみたまさひろ <tommy / tmtm.org> wrote:

> こんな感じ↓のワンライナーで、同じPIDの時に同じ乱数が生成されることと、
> p352 で直ってることが確認できました。
> 
>    % ruby -rsecurerandom -e 'p [$$, SecureRandom.hex(16)]; 33000.times{pid=fork{p [$$,SecureRandom.hex(16)]}; Process.waitpid pid}'

ダメでした…。次のスクリプトで同じ乱数が生成されました。

% ruby -rsecurerandom -e 'OpenSSL::Random.random_bytes(16); 33000.times{pid=fork{p [$$,SecureRandom.hex(16)]}; Process.waitpid pid}'

SecureRandom.random_bytes がそのプロセスで最初に呼ばれた時には常に
OpenSSL::Random.seed を呼ぶようにしてみたらうまくいきました。先のメール
の ary.to_s も一緒に修正しています。

Index: lib/securerandom.rb
===================================================================
--- lib/securerandom.rb	(revision 32735)
+++ lib/securerandom.rb	(working copy)
@@ -50,12 +50,12 @@
   def self.random_bytes(n=nil)
     n ||= 16
     if defined? OpenSSL::Random
-      @pid = $$ if !defined?(@pid)
+      @pid = 0 if !defined?(@pid)
       pid = $$
       if @pid != pid
         now = Time.now
         ary = [now.to_i, now.usec, @pid, pid]
-        OpenSSL::Random.seed(ary.to_s)
+        OpenSSL::Random.seed(ary.join('.'))
         @pid = pid
       end
       return OpenSSL::Random.random_bytes(n)

-- 
とみたまさひろ <tommy / tmtm.org>
http://twitter.com/tmtms
D68F 8F55 7F6C 5908 88EB  1EBA 25ED DEE7 BBE8 1752