bugfix: fixed duplicated seeds.
ngx.time() + ngx.worker.pid() maybe get duplicated seeds. get from /dev/urandom first.
This commit is contained in:
parent
d968ee9cfd
commit
011062967a
1 changed files with 23 additions and 8 deletions
|
@ -2,25 +2,40 @@ local _M = {}
|
|||
|
||||
local seeds = {}
|
||||
local original_randomseed = math.randomseed
|
||||
math.randomseed = function(seed)
|
||||
local pid = ngx.worker.pid()
|
||||
|
||||
if seeds[pid] then
|
||||
local function get_seed_from_urandom()
|
||||
local seed
|
||||
local frandom = io.open("/dev/urandom", "rb")
|
||||
if frandom then
|
||||
local str = frandom:read(4)
|
||||
frandom:close()
|
||||
seed = 0
|
||||
for i = 1, 4 do
|
||||
seed = 256 * seed + str:byte(i)
|
||||
end
|
||||
end
|
||||
return seed
|
||||
end
|
||||
|
||||
math.randomseed = function()
|
||||
local pid = ngx.worker.pid()
|
||||
local seed = seeds[pid]
|
||||
if seed then
|
||||
ngx.log(ngx.WARN,
|
||||
string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", seed, pid))
|
||||
return
|
||||
end
|
||||
|
||||
seed = get_seed_from_urandom()
|
||||
if not seed then
|
||||
seed = ngx.now() * 1000 + pid
|
||||
end
|
||||
original_randomseed(seed)
|
||||
seeds[pid] = seed
|
||||
end
|
||||
|
||||
local function randomseed()
|
||||
math.randomseed(ngx.time() + ngx.worker.pid())
|
||||
end
|
||||
|
||||
function _M.init_worker()
|
||||
randomseed()
|
||||
math.randomseed()
|
||||
end
|
||||
|
||||
return _M
|
||||
|
|
Loading…
Reference in a new issue