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

版本