Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么使Lua表的键顺序不确定?_Lua_Lua Table - Fatal编程技术网

是什么使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 或: 在如此少的几行中,决定论似乎是显而易见的,解释者

我知道,在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
或:

在如此少的几行中,决定论似乎是显而易见的,解释者怎么可能转储不同的结果呢?是什么让钥匙在这里随机排列?顺序是在表的创建时随机的还是在表的迭代时随机的


谢谢大家!

表关联数组用于按键查找,因此在遍历时没有定义良好的顺序。 这篇文章很好地概述了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 */