From: "とみたまさひろ" Date: 2011-07-29T20:04:22+09:00 Subject: [ruby-dev:44270] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について とみたです。 On Thu, 28 Jul 2011 02:13:07 +0900 とみたまさひろ 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) -- とみたまさひろ http://twitter.com/tmtms D68F 8F55 7F6C 5908 88EB 1EBA 25ED DEE7 BBE8 1752