Lua表中键的顺序为什么不确定?

我知道,在Lua中,表键不按创建顺序保留。到目前为止,我认为这是由于内部实现可能会持续重新排列树节点以提高性能。然而,我不明白为什么即使在独立运行的情况下执行下面的片段,它也不会导出相同的结果(例如为每个运行运行lua解释器):

`` ` --示例脚本 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

```

为什么在如此少的行中(其中确定性似乎很明显),解释器导出不同的结果?是什么使键的顺序在这里随机?顺序在表的创建时还是在表的迭代时随机?

谢谢!

点赞
用户9706
用户9706

一张表(关联数组)用于按键查找,因此在迭代过程中没有良好定义的顺序。Lua 5.3 实现笔记 是对 Lua 实现表数据结构的概览。也就是说,哈希表。如果对手可以触发(键)冲突,则哈希表从 O(1) 的插入性能变成了每个操作的 O(n),如果你执行 n 个操作,则会出现 O(n^2) 的行为。因此,最好使用一个对手无法预测其行为的哈希函数。一种方法是使用一个随机化种子作为哈希函数的一部分:

lstate.h: typedef struct global_State {
...
lstate.h: unsigned int seed;  /* 用于哈希的随机化种子 */
2021-02-23 09:17:05