AdairXie Blog

坚持做对的事情,并把事情做对

Lua string 哈希碰撞

Hash Collisions

Lua 中 40 字节以下的字符串会被内部化到一张表中(Lua 5.3),这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份,这被称为字符串的内部化。 其实字符串在 Lua VM 中是以两种内部形式保存的:短字符串及长字符串。其界限默认设置为40(字节) 对于比较长的字符串(32字节以上),为了加快哈希过程,计算字符串哈希值是跳跃进行的...

NGINX resolver 配置中的 "坑"

不要着急去当第一个吃螃蟹的人

最近我把自己的 OpenResty 升级到了最新的 openresty/1.13.6.1 版本,却发现 dns 解析不能正常工作了: ... resolver 127.0.0.1; server { listen 8888; server_name _; location / { content_by_lua_block { ...

TIME_WAIT 的 Timer

我们知道 TCP 在关闭连接的时候,主动断开的一方将处于 TIME_WAIT 状态,并将持续两倍的 MSL。这个 MSL 在 RFC 793 中的建议是 1 分钟,但是很多系统实现都是 30 秒,所以 TIME_WAIT 的时长也就是 1 分钟。 而且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它。我们可以通过 ss 来查看 TIME_WAIT 的剩余存活时长(...

直观的表现 PRNG 周期性

无图无真相。真的真,真出声

我在前面的一些文章中介绍过:Lua 随机数算法用的是 LCG(32位的随机数,周期最多为232); LuaJIT 用的是 LFSR,周期达到 2223。下面是我分别用 Lua 和 LuaJIT 的随机数填充一个位图,代码: #!/usr/bin/env lua -- Draws the B/W image with lua-gd local gd = require "gd" loca...

重新认识 randomseed

原生 Lua 的 randomseed 是不支持浮点数的

在之前的文章中,我写过这样的测试用例: local seed = 123456 for i=1,2 do math.randomseed(seed + (i-1)/10) local num = {} for j=1,10 do table.insert(num, math.random(100)) end print(table.c...

Lua 中的随机数

随机数生成对我们太重要了,我们不能让它随机生成

Lua 随机数算法用的是 libc 中的 rand, 也就是 LCG。然而这个算法的随机性一般。尤其是在一些平台上,当随机种子变化非常小的时候,产生的随机数变化也非常小。这样再经过 Lua 的精度取舍之后,产生的随机序列仍然很相似(伪随机的结果变成可预知性)。 lua-l 上也讨论过这个问题 msg00564,lua 的作者之一 @lhf 给出的解决方案是先弹出前面几个看起来「不怎么随机」...

正确认识随机数

北京车牌摇号的算法是公平的

前一阵子我去参加了 OpenResty Con 2017, 来自 KONG 的 Thibault Charbonnier 分享了他们在 OpenResty 上关于随机数应用的一些 Tips. 这才知道 LuaJIT 使用的随机算法和原生 Lua 的算法是不同的。我在自己的项目中也常常有使用随机数,但基本上只是直接使用,没有探寻背后的一些原理。刚好利用这个机会来好好补充下这方面的知识。 引言...

警惕系统中那些异常的 RST

认真学习协议栈很重要

我们的系统有一个应用启用了连接池来连接后端的应用,最近我却发现这个连接池貌似并不能正常工作。理论上来说,当启用了连接池,应用到后端的连接应该稳定才对,而我通过 ss 观察到的现象却是应用不断的建立连接,断开连接。更为奇怪的是,应用方并没有出现 TIME_WAIT。起初我怀疑是服务端主动关闭了连接,但是在服务端也并没有发现 TIME_WAIT,所以可以基本排除这个问题。 之后抓了下包才发现,...

OpenResty 中的安全隐患

在 OR 的官方 GitHub 中,介绍了这么一种简单的「路由」写法 # use nginx var in code path # CAUTION: contents in nginx var must be carefully filtered, # otherwise there'll be great security risk! location ~ ^/app/([-_a-zA-Z...

Lua 汉字拼音首字母提取

计算机内部只存储和处理字节,字符只是人类理解的概念。

最近项目上有个需求,需要将一些联系人数据按照拼音首字母排序。google 了一番,竟然没有找到一个合适的 Lua 解决方案。倒是找到一个 lua-pinyin,粗略翻了下源码发现其是将所有的中文返回全部完整的拼音,原理是将所有汉字对应拼音创建好数据字典,载入 Lua,之后查询这个字典,返回对应的拼音。但是这对于我这个需求来说显然是太臃肿了,我只需要返回首字母就可以了,却载入一个巨大的字典,感...