とみたです。

On Thu, 28 Jul 2011 00:40:28 +0900
"NARUSE, Yui" <naruse / airemix.jp> 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('.') 等のようにした方がいいんじゃないかと
思います。

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