【问题标题】:Is there a way to tell `next` to start at specific key?有没有办法告诉 `next` 从特定键开始?
【发布时间】:2023-03-28 02:30:01
【问题描述】:

我的理解是pairs(t) 只是返回next, t, nil

如果我将其更改为 next, t, someKey(其中 someKey 是我表中的有效键),next 会在该键处/之后开始吗?

我在Lua Demo 页面上试过这个:

t = { foo = "foo", bar = "bar", goo = "goo" }

for k,v in next, t, t.bar do
  print(k);
end

每次运行代码时都会得到不同的结果。所以指定一个起始键是有效果的,不幸的是这个效果似乎有点随机。有什么建议吗?

【问题讨论】:

  • pairs 也会随机迭代哈希图。

标签: lua iterator next lua-table


【解决方案1】:

每次运行一个遍历 Lua 表的程序时,顺序都会有所不同,因为 Lua 在内部使用哈希表中的随机盐。

这是在 Lua 5.2 中引入的。见luai_makeseed

【讨论】:

  • 为什么要随机排序?
  • @Aubergine18,以避免在处理哈希表中的冲突时利用二次或更差行为的攻击。
  • 数字索引是否也随机化以防止类似攻击?
  • @ChrisBeck,一些正整数索引可能会在哈希部分结束,但这些细节应该无关紧要。
  • @lhf:谢谢你的信息,我不知道。我已删除我的评论
【解决方案2】:

来自luadocumentation

未指定枚举索引的顺序,甚至 对于数字索引。 (要按数字顺序遍历 table,请使用 数字for.)

【讨论】:

  • 这种随机性究竟从何而来?我不太擅长阅读 C 代码(lua.org/source/5.3/ltable.c.html),但据我所知,表的内部索引并没有被不断随机化。如果我开始对表进行更改(添加/删除/更新项目),我可以看到它会如何改变,但如果我没有这样做,内部索引将是静态的?那么next 函数是否在进行随机化?
  • ...只是为了澄清...当一个非数字键添加到表中时,它会被散列并且该散列进入内部索引。因此,在设置了一些值之后,顺序可能会有所不同,但它应该保持不变,直到对表进行任何进一步的更改。由于内部表索引首先基于数字,然后是哈希,我们知道数字表在哪里结束(所以我们知道第一个哈希在哪里)为什么next 不总是从第一个哈希开始?
  • @Aubergine18 这是随机的,因为 Lua 表是哈希表,即 unordered。特定键散列到的值与项目添加到表中的顺序无关。现在 internally 项目 do 有一个顺序,如果你连续迭代同一个表 10 次,你每次都会以相同的顺序得到它们,但是这是一个实现细节,您无法控制该顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2011-07-31
  • 2011-06-25
相关资源
最近更新 更多