From: "とみたまさひろ" Date: 2011-07-28T02:13:07+09:00 Subject: [ruby-dev:44263] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について とみたです。 On Thu, 28 Jul 2011 00:40:28 +0900 "NARUSE, Yui" wrote: > あ、わかった、r32050 ですね。 > つまり、Ruby 1.8.7 ならば最新のパッチレベルを使って頂ければ大丈夫なはずです。 おお! ありがとうございます! というか、1.8.7-p352 を使ってたつもりが、現象が発生した環境は 1.8.7-p334 でした… orz... こんな感じ↓のワンライナーで、同じPIDの時に同じ乱数が生成されることと、 p352 で直ってることが確認できました。 % ruby -rsecurerandom -e 'p [$$, SecureRandom.hex(16)]; 33000.times{pid=fork{p [$$,SecureRandom.hex(16)]}; Process.waitpid pid}' ところで、色々と調べている時に見つけたのですが、securerandom.rb の次の行で、 ary = [now.to_i, now.usec, @pid, pid] OpenSSL::Random.seed(ary.to_s) 1秒以内に特定の usec と PID のパターンが発生すると、1.8.7 では同じ ary.to_s が生成されるように思うのですが、問題ないでしょうか。たとえば、 now.to_i now.usec @pid pid 1311785953 11 2222 22233 1311785953 1122 2222 233 この例だと、ary.to_s の結果が両方とも "131178595311222222233" になります。 # 1.9.2 だと Array#to_s の表現が変わったので同じにはなりませんでした。 ary.to_s じゃなくて ary.join('.') 等のようにした方がいいんじゃないかと 思います。 -- とみたまさひろ http://twitter.com/tmtms D68F 8F55 7F6C 5908 88EB 1EBA 25ED DEE7 BBE8 1752