我在前一篇文章介绍过下面这 3 个字符串拥有相同的 hash,会导致 Hash Dos 问题:
但是 Lua 并没有将自己的 string hash 算法暴露出来,那应该怎么验证呢?其实翻看 Lua 5.1.4 源码, 中关于 string hash 是这么定义的:
其实这个算法叫 JSHash,这里我用 LuaJIT 的 bit 来实现个:
可以看到上面 3 个字符串的 hash 都是:1777619995
另外需要注意的是 LuaJIT 的 hash 算法和 Lua 是不同的,其是一个 lookup3 的变种。
lookup3 也被暴雪公司使用于解析其各游戏的 MPQ 文件
有关字符串 hash 算法的对比,可以参考下面这两篇文章,写的都比我好:
各种字符串Hash函数比较
如何设计并实现一个线程安全的 Map ?(上篇)
赞赏是对作者最大的支持
领取专属 10元无门槛券
私享最新 技术干货