lua-resty-jit-uuid
用于 OpenResty/LuaJIT 的快速且无依赖的 UUID 生成器
$ opm get thibaultcha/lua-resty-jit-uuid
lua-resty-jit-uuid
[![模块版本][badge-version-image]][luarocks-resty-jit-uuid] [![构建状态][badge-travis-image]][badge-travis-url] [![覆盖率][badge-coveralls-image]][badge-coveralls-url]
一个纯 LuaJIT(无依赖)的 UUID 库,针对性能进行了优化。
动机
该模块旨在成为一个无依赖、高性能且完整的 LuaJIT 和 ngx_lua UUID 库。
与 FFI 和 C 绑定不同,它不依赖于系统中是否安装了 libuuid。除此之外,它的性能优于大多数(全部?)基准测试中的生成器,包括 FFI 绑定。
最后,它还提供了其他功能,例如 UUID v3/v4/v5 生成和 UUID 验证。
请参阅基准测试部分,了解 Lua/LuaJIT 其他 UUID 库之间的比较。
用法
LuaJIT
local uuid = require 'resty.jit-uuid'
uuid.seed() ---> automatic seeding with os.time(), LuaSocket, or ngx.time()
uuid() ---> v4 UUID (random)
uuid.generate_v4() ---> v4 UUID
uuid.generate_v3() ---> v3 UUID (name-based with MD5)
uuid.generate_v5() ---> v5 UUID (name-based with SHA-1)
uuid.is_valid() ---> true/false (automatic JIT PCRE or Lua patterns)
OpenResty
http {
init_worker_by_lua_block {
local uuid = require 'resty.jit-uuid'
uuid.seed() -- very important!
}
server {
location / {
content_by_lua_block {
local uuid = require 'resty.jit-uuid'
ngx.say(uuid())
}
}
}
}
注意:在 ngx_lua 中生成 v4(随机)UUID 时,非常重要的是您在init_worker
阶段对该模块进行初始化。如果不这样做,您的工作进程将生成相同的 UUID 序列,这可能导致应用程序出现严重问题。初始化要求也适用于 ngx_lua 之外的使用场景,尽管在这些情况下初始化并不那么敏感。此外,您应该注意 `lua_code_cache` 指令的使用:如果禁用 Lua 代码缓存,则后续请求期间生成的 UUID 序列将全部相同,除非为每个请求都初始化该模块。就像禁用 Lua 代码缓存一样,这种行为被认为是 ngx_lua 的反模式,您应该避免它。
安装
可以通过 Luarocks 安装此模块
$ luarocks install lua-resty-jit-uuid
或通过 opm
$ opm get thibaultcha/lua-resty-jit-uuid
或者可以手动复制到您的LUA_PATH
中。
文档
文档可在以下网址在线获取:<http://thibaultcha.github.io/lua-resty-jit-uuid/>。
基准测试
在该模块的每个实现步骤中都进行了仔细的基准测试,以确保 OpenResty 和纯 LuaJIT 获得最佳性能。例如,UUID 验证将在可能的情况下使用 JIT PCRE 而不是 Lua 模式。
bench.lua
文件提供了几个流行的 UUID 库的 UUID 生成基准测试。
运行make bench
来运行它们
LuaJIT 2.1.0-beta1 with 1e+06 UUIDs
UUID v4 (random) generation
1. resty-jit-uuid took: 0.064228s 0%
2. FFI binding took: 0.093374s +45%
3. C binding took: 0.220542s +243%
4. Pure Lua took: 2.051905s +3094%
UUID v3 (name-based and MD5) generation if supported
1. resty-jit-uuid took: 1.306127s
UUID v5 (name-based and SHA-1) generation if supported
1. resty-jit-uuid took: 4.834929s
UUID validation if supported (set of 70% valid, 30% invalid)
1. resty-jit-uuid (JIT PCRE enabled) took: 0.223060s
2. FFI binding took: 0.256580s
3. resty-jit-uuid (Lua patterns) took: 0.444174s
FFI 绑定:<https://github.com/bungle/lua-resty-uuid>
C 绑定:<https://github.com/Mashape/lua-uuid>
纯 Lua:<https://github.com/Tieske/uuid>
resty-jit-uuid:此模块(生成百分比比较的基本参考)
注意:通过启用 lua-resty-core,可以大大提高 ngx_lua 中的 UUID 验证性能(JIT PCRE)。
贡献
尤其欢迎您提出改进此模块或基准测试性能(任何基准测试库)的建议。
许可证
该作品在 MIT 许可证下授权。
[luarocks-resty-jit-uuid]: http://luarocks.org/modules/thibaultcha/lua-resty-jit-uuid
[badge-travis-url]: https://travis-ci.org/thibaultcha/lua-resty-jit-uuid [badge-travis-image]: https://travis-ci.org/thibaultcha/lua-resty-jit-uuid.svg?branch=master
[badge-coveralls-url]: https://coveralls.io/r/thibaultcha/lua-resty-jit-uuid?branch=master [badge-coveralls-image]: https://coveralls.io/repos/thibaultcha/lua-resty-jit-uuid/badge.svg?branch=master&style=flat
[badge-version-image]: https://img.shields.io/badge/version-0.0.7-blue.svg?style=flat
作者
Thibault Charbonnier (thibaultcha)
许可证
mit
依赖
luajit
版本
-
用于 OpenResty/LuaJIT 的快速且无依赖的 UUID 生成器 2017-12-16 23:30:29
-
用于 OpenResty/LuaJIT 的快速且无依赖的 UUID 生成器 2017-01-18 01:56:19
-
用于 OpenResty/LuaJIT 的快速且无依赖的 UUID 生成器 2017-01-11 00:27:27