1、在resty目录下,写了一个murmur.lua,里面用ffi调用
local ffi = require "ffi"
local ffi_new=ffi.new
local C =ffi.C
local ffi_str = ffi.string
local setmetatable=setmetatable
local error = error
module(...)
_VERSION='0.01'
local mt={__index = _M}
ffi.cdef[[
void ndk_murmur2_hash(const void * data, int len,unsigned int seed);
void ndk_murmur264A_hash(const void * data, int len,unsigned uint64_t seed);
]]
function hash2(string,key)
local len = string.len(string)
local hash = C.ndk_murmur2_hash(string,len,key)
return ffi_str(hash)
end
function hash264A(string,key)
local len = string.len(string)
local hash = C.ndk_murmur264A_hash(string,len,key)
return ffi_str(hash)
end
local class_mt = {
-- to prevent use of casual module global variables
__newindex = function (table, key, val)
error('attempt to write to undeclared variable "' .. key .. '"')
end
}
2、在ngx_devel_kit-0.2.19/src/hash/murmurhash2.c文件中定义两个函数
unsigned int MurmurHash2 ( const void * key, int len, unsigned int seed )
uint64_t MurmurHash64A ( const void * key, int len, uint64_t seed )
3、在ngx_devel_kit-0.2.19/src/ndk_hash.c定义
void
ndk_murmur2_hash (u_char *p, char *data, size_t len)
{
uint32_t hash;
hash = MurmurHash2 (data, len, 47);
ndk_hex_dump (p, (u_char*) &hash, 4);
}
void
ndk_murmur264A_hash (u_char *data, size_t len,size_t seed)
{
uint64_t hash;
seed = (uint64_t)seed
hash = MurmurHash64A(data, len, seed);
}
4、在nginx/conf/目录下建立一个文件mur.lua
local mur= require "resty.murmur"
ngx.say(mur.hash2("test",33))
在nginx.conf中调用
content_by_lua_file 'conf/mur.lua';
运行报错:
2014/04/01 16:09:06 [error] 89643#0: *2 lua entry thread aborted: runtime error: /usr/local/openresty/nginx/conf/mur.lua:2: attempt to call field 'hash2' (a nil value)
stack traceback:
coroutine 0:
/usr/local/openresty/nginx/conf/mur.lua: in function </usr/local/openresty/nginx/conf/mur.lua:1>, client: 10.68.143.131, server: 10.68.150.6, request: "GET /mur HTTP/1. 1", host: "10.68.150.6"
我哪里写得不对?
C语言我觉得不是很好,照葫芦画瓢,写得不对的地方,请大家多多包涵。