lua - 是什么让 Lua 表的键顺序不确定?
问题描述
我知道,在 Lua 中,表键不会按创建顺序保留。到目前为止,我认为这是由于内部实现可能会不断地重新排列树节点以提高性能。但是,我不明白为什么以下代码段即使在独立运行中执行(例如lua
,每次运行都运行解释器)也不会转储相同的结果:
-- Example script
local t = {a = 1, b = 2}
for k,v in pairs(t) do
print(k,v)
end
有时上面的代码会转储:
a 1
b 2
或者:
b 2
a 1
这么少的行(其中确定性似乎很明显),解释器怎么可能转储不同的结果?是什么让这里的键顺序随机?在表的创建或表的迭代中顺序是随机的吗?
谢谢!
解决方案
表(关联数组)用于按键查找,因此在迭代时没有明确定义的顺序。 关于 Lua 5.3 实现的笔记 很好地概述了 Lua 如何实现表数据结构。即哈希表。如果对手可以触发(键)冲突,则哈希表从 O(1) 插入性能变为 O(n) 每个操作,并且如果您执行该 n 操作,您将获得 O(n^2) 行为。因此,最好使用攻击者无法预测的行为的哈希函数。一种方法是使用随机种子作为散列函数的一部分:
lstate.h: typedef struct global_State {
...
lstate.h: unsigned int seed; /* randomized seed for hashes */
推荐阅读
- mysql - 如何使用 sub 或 join 查询从 MySQL 检索数据?
- docker - 步骤 1/11 上的 Docker 安装错误 ./bin/acore-docker-build
- linux - 下面的命令是什么:chmod -r?
- reactjs - 将值传递给 Recharts BarChart 中的 tickFormatter 函数
- menu - 如何在 Sublime 3 中将项目添加到菜单中?
- angular - 无法设置未定义的属性“nometape”
- c# - 具有依赖注入的 AutoMapper 不映射配置文件?
- ruby-on-rails - Ruby on Rails / Ransack:过滤属于当前用户的所有对象
- html - Css 错误“GET /static/%20style.css HTTP/1.1”404 - 使用 Pycharm 3.8.1
- memory - 在引导模式 0 下对 RZ/A1L 进行地址重新映射后,启动代码是否仍可访问?