下面以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)) .. '\r\n')
ngx.print(guid() .. '\r\n') end ngx.print("execute time:" .. socket.gettime()-start .. '\r\n') ngx.exit(200)
上面guid方法中seed讀者可以自己自行擴展,比如再加入'A-Z'大寫字符,guid我以32位的字符進行輸出,
在實際測試過程中, 10萬級的數據生成速度不考慮寫文件的IO時間,遠遠低於0.4秒,而同等數量使用ngx.md5()時則足足多了一倍的時間;
再從唯一性上進行分析,10萬級的生成串中,測試了10次,沒有發現任何一次有重復的字符串,說明自配的guid算法足以滿足實際生產使用;