下面以Lua为例实现guid的生成,再对比nginx服务器的MD5算法进行比对效率
function guid() local seed = { '0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t', 'u','v','w','x','y','z' } local sid = "" for i=1, 32 do sid = sid .. seed[math.random(1,36)] end return string.format('%s-%s-%s-%s-%s', string.sub(sid, 1, 8), string.sub(sid, 9, 12), string.sub(sid, 13, 16), string.sub(sid, 17, 20), string.sub(sid, 21, 32) ) end local s = 0 local start = socket.gettime() while s < 100000 do s=s+1 --ngx.print(ngx.md5(math.random(1,36)) .. ' ')
ngx.print(guid() .. ' ') end ngx.print("execute time:" .. socket.gettime()-start .. ' ') ngx.exit(200)
上面guid方法中seed读者可以自己自行扩展,比如再加入'A-Z'大写字符,guid我以32位的字符进行输出,
在实际测试过程中, 10万级的数据生成速度不考虑写文件的IO时间,远远低于0.4秒,而同等数量使用ngx.md5()时则足足多了一倍的时间;
再从唯一性上进行分析,10万级的生成串中,测试了10次,没有发现任何一次有重复的字符串,说明自配的guid算法足以满足实际生产使用;