是什么使Lua表的键顺序不确定?
我知道,在Lua中,表键不是按创建顺序保存的。到目前为止,我认为这是由于内部实现可能会继续重新排列树节点以提高性能。但是,我不明白为什么以下代码段即使在独立运行中执行(例如,每次运行运行lua解释器),也不会转储相同的结果:是什么使Lua表的键顺序不确定?,lua,lua-table,Lua,Lua Table,我知道,在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 或: 在如此少的几行中,决定论似乎是显而易见的,解释者
-- Example script
local t = {a = 1, b = 2}
for k,v in pairs(t) do
print(k,v)
end
有时,上面的代码会转储:
a 1
b 2
或:
在如此少的几行中,决定论似乎是显而易见的,解释者怎么可能转储不同的结果呢?是什么让钥匙在这里随机排列?顺序是在表的创建时随机的还是在表的迭代时随机的
谢谢大家! 表关联数组用于按键查找,因此在遍历时没有定义良好的顺序。 这篇文章很好地概述了Lua如何实现表数据结构。即哈希表。如果对手可以触发密钥冲突,则哈希表将从O1 insert per operation变为On per operation,如果执行n个操作,则会出现^2行为。因此,使用一个对手无法预测的哈希函数是非常必要的。一种方法是使用随机种子作为哈希函数的一部分:
lstate.h: typedef struct global_State {
...
lstate.h: unsigned int seed; /* randomized seed for hashes */
谢谢!这是我期望得到的答案!这种随机化散列函数的方法非常聪明!
lstate.h: typedef struct global_State {
...
lstate.h: unsigned int seed; /* randomized seed for hashes */