[size=large]为什么要在nginx中使用lua嵌入c程序?[/size]
1.性能上的考虑,lua毕竟是一个脚本语言,对于某些特定的功能如果用纯lua来实现性能上一般都会比用c要逊色一些。
2.没有现成的库供我们使用,实际上互联网上已经有很多现成的第三方lua库供我们使用,比如读取redis数据的resty.redis;将json转化为lua本地数据格式的cjson等。当找不到合适我们使用的第三方库的时候,我们就需要自己动手了。当然如果能够直接使用lua来写一个满足我们自己使用的库也是可以的,如果考虑到性能问题,用c来实现是一个不错的选择。
[size=large]
我们这里打算实现两个方法[/size]
1.对一个字符串做hash并对其hash值取摸,在lua中我们可以这样调用该方法:
local value = demo.mod("abcdefe",8);
其中demo是我们写好的c库;
mod方法的第一个参数是要进行取摸的字符串;
第二个参数是摸;
2.由于lua中的时间函数无法精确到毫秒级,我们这里实现一个可以获取系统毫秒的时间:
local time = demo.time();
[size=large]具体实现[/size]
首先引入lua的c api头文件和我们用到的时间头文件
实现一个murmurhash算法,用来hash我们的字符串
typedef unsigned long long uint64_t;
typedef long long int64_t;
typedef long int int32_t;
1.性能上的考虑,lua毕竟是一个脚本语言,对于某些特定的功能如果用纯lua来实现性能上一般都会比用c要逊色一些。
2.没有现成的库供我们使用,实际上互联网上已经有很多现成的第三方lua库供我们使用,比如读取redis数据的resty.redis;将json转化为lua本地数据格式的cjson等。当找不到合适我们使用的第三方库的时候,我们就需要自己动手了。当然如果能够直接使用lua来写一个满足我们自己使用的库也是可以的,如果考虑到性能问题,用c来实现是一个不错的选择。
[size=large]
我们这里打算实现两个方法[/size]
1.对一个字符串做hash并对其hash值取摸,在lua中我们可以这样调用该方法:
local value = demo.mod("abcdefe",8);
其中demo是我们写好的c库;
mod方法的第一个参数是要进行取摸的字符串;
第二个参数是摸;
2.由于lua中的时间函数无法精确到毫秒级,我们这里实现一个可以获取系统毫秒的时间:
local time = demo.time();
[size=large]具体实现[/size]
首先引入lua的c api头文件和我们用到的时间头文件
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <sys/time.h>
实现一个murmurhash算法,用来hash我们的字符串
typedef unsigned long long uint64_t;
typedef long long int64_t;
typedef long int int32_t;
static uint64_t murmurhash64A(const void *key,size_t len,int32_t seed){
int64_t m = 0xc6a4a7935bd1e995LL;
int r = 47;
uint64_t h = seed ^ (len * m);