openresty中甚至没有为我们提供一个方便计算hash的函数,这里我们介绍一下如何通过调用nginx内部的ngx_murmur_hash2()来实现此功能。

1. lua-resty-murmurhash2

其实lua-resty-murmurhash2.lua也只是简单的将nginx的内部函数ngx_murmur_hash2()导出,代码比较简单,我们来看一下:

local ffi      = require "ffi"
local ffi_cast = ffi.cast
local C        = ffi.C
local tonumber = tonumber

ffi.cdef[[
typedef unsigned char u_char;
uint32_t ngx_murmur_hash2(u_char *data, size_t len);
]]

return function(value)
    return tonumber(C.ngx_murmur_hash2(ffi_cast('uint8_t *', value), #value))
end

1.1 调用murmurhash2函数

我们可以通过如下的方式来调用:

local mmh2 = require("resty.murmurhash2")


local str = "hello, world"
local h = mmh2(str)

print("hash(str): ", h)

注:如果用到外部的动态链接库,可以将其拷贝到/usr/lib64/、/usr/local/openresty/lualib/ 目录下,或者拷贝到/usr/local/openresty/luajit/lib/ 目录下



[参考]

  1. murmurhash2官网

  2. 在nginx中采用lua对请求的url进行hash取模