最近在做nginx+lua的加密验证,把一些记录信息打印到nginx的error日志中。为了关联起每次的http请求,所以需要做一个标识。后续在查日志的时候,可以知道哪些日志是同一次的请求。后来想到使用随机数来实现。
实现方案
在每次请求的开始,随机生成一个1到1000000之间的数字,然后写日志的时候,把这个数字打印到日志的开始。这样拥有相同数字的即是同一次请求。(因为随机数的生成可能会生成相同的,所以可能会有不同的请求共用相同的随机数标识。不过这个对于目前的请求来说不会有太大的问题。)
lua的随机数生成需要一个种子数,可以使用时间戳来做种子数。相同的种子数生成的随机数是相同的。
随机数方案1
使用os.time()获取随机数。
#!/usr/bin/env lua
math.randomseed(os.time())
math.random(1,100)
方案优点
不用安装额外的模块,可以直接使用。
方案缺点
os.time()生成的时间戳是基于秒的,请求中,每秒会有多次的请求。因为在同一秒访问,所以这些请求的随机数都会相同。
随机数方案2
luasocket需要安装。luasocket安装的教程:点击
因为luasocket可以获取到毫秒的时间戳,更精确的随机数可以使用luasocket获取随机数。
#!/usr/bin/env lua
local socket = require("socket") --载入luasocket
math.randomseed(socket.gettime()) --获取时间戳
local random_number = math.random(1,100000) --获取随机数
优点
可以支持更精确的随机数
缺点
需要额外安装模块