最近下了春哥的lua_resty_string_master库,这个库在nginx下运行调试时一点问题都没。但我想单独的将lua_resty_string_master中的lua脚本拿出来运行测试,别嵌在nginx中,但是在luajit test_md5.lua时出现:
[root@fcc-dev test_lua_resty_string]# luajit test_md5.lua
luajit: ./md5.lua:44: luajit: undefined symbol: MD5_Init
这样的问题,应该是openssl库没有加载进来,请问在这个例子中如何加呢?谢谢了
这里涉及到的两个文件(md5.lua和test_md5.lua):
1. md5.lua
local ffi = require "ffi"
local ffi_new = ffi.new
local ffi_str = ffi.string
local C = ffi.C
local setmetatable = setmetatable
--local error = error
local _M = { _VERSION = '0.09' }
local mt = { __index = _M }
ffi.cdef[[
typedef unsigned long MD5_LONG ;
enum {
MD5_CBLOCK = 64,
MD5_LBLOCK = MD5_CBLOCK/4
};
typedef struct MD5state_st
{
MD5_LONG A,B,C,D;
MD5_LONG Nl,Nh;
MD5_LONG data[MD5_LBLOCK];
unsigned int num;
} MD5_CTX;
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
]]
local buf = ffi_new("char[16]")
local ctx_ptr_type = ffi.typeof("MD5_CTX[1]")
function _M.new(self)
local ctx = ffi_new(ctx_ptr_type)
if C.MD5_Init(ctx) == 0 then
return nil
end
return setmetatable({ _ctx = ctx }, mt)
end
function _M.update(self, s)
return C.MD5_Update(self._ctx, s, #s) == 1
end
function _M.final(self)
if C.MD5_Final(buf, self._ctx) == 1 then
return ffi_str(buf, 16)
end
return nil
end
function _M.reset(self)
return C.MD5_Init(self._ctx) == 1
end
return _M
2. 测试文件test_md5.lua
local resty_md5 = require "md5"
local md5 = resty_md5:new()
if not md5 then
print("failed to create md5 object")
return
end
local ok = md5:update("hel")
if not ok then
print("failed to add data")
return
end
ok = md5:update("lo")
if not ok then
print("failed to add data")
return
end
local digest = md5:final()
local str = require "resty.string"
print("md5: ", str.to_hex(digest))
-- yield "md5: 5d41402abc4b2a76b9719d911017c592"