【问题标题】:What makes Lua tables key order be undeterministic?是什么让 Lua 表的键顺序不确定?
【发布时间】:2021-05-25 12:16:10
【问题描述】:

我知道,在 Lua 中,表键不会按创建顺序保留。到目前为止,我认为这是由于内部实现可能会不断地重新排列树节点以提高性能。但是,我不明白为什么以下 sn-p 不会转储相同的结果,即使它是在独立运行中执行的(例如,每次运行都运行 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 lua-table


    【解决方案1】:

    表(关联数组)用于按键查找,因此在迭代时没有明确定义的顺序。 Notes on the Implementation of Lua 5.3 很好地概述了 Lua 如何实现表数据结构。 IE。哈希表。如果对手可以触发(键)冲突,则哈希表从 O(1) 插入性能变为 O(n) 每个操作,并且如果您执行该 n 操作,您将获得 O(n^2) 行为。因此,desirable 使用攻击者无法预测的行为的哈希函数。一种方法是使用随机种子作为哈希函数的一部分:

    lstate.h: typedef struct global_State {
    ...
    lstate.h: unsigned int seed;  /* randomized seed for hashes */
    

    【讨论】:

    • 非常感谢!这是我期望得到的答案!这种随机化散列函数的方法非常聪明!
    猜你喜欢
    • 2020-11-19
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2022-12-03
    • 2010-11-23
    • 2011-12-16
    相关资源
    最近更新 更多