首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问表中的哈希键的顺序在lua5.1和lua5.3之间是否不同?

访问表中的哈希键的顺序在lua5.1和lua5.3之间是否不同?
EN

Stack Overflow用户
提问于 2022-10-20 07:58:51
回答 2查看 29关注 0票数 -1

我的问题是为什么表tt中的键和值(512)不一样:

我有相同的lua代码:

代码语言:javascript
运行
复制
t={501,502,503,504,505,506,507,508,509,510,511,512}
tt={}
for _, id in pairs(t) do
    print(id)
    tt[id] = id
end
print("----------------------")
for k,v in pairs(tt) do
    print(k,v)
end

在条例5.1中:

第5.3章:

EN

回答 2

Stack Overflow用户

发布于 2022-10-20 08:03:52

pairs不保证按什么顺序迭代表中的元素。

来自https://www.lua.org/pil/7.3.html的文档

对函数..。以任意顺序.

票数 2
EN

Stack Overflow用户

发布于 2022-10-20 08:31:36

正如Ivo所指出的,您应该永远不要依赖于哈希表遍历的确定性顺序。

这非常容易破坏(1)跨解释器,(2)跨不同的Lua版本,这可能会影响哈希函数的实现细节。

此外,在实践中,散列部分的顺序通常取决于插入顺序--也就是说,两个表可能具有相同的键,但由于另一个插入/删除操作序列,pairs/next不必按相同的顺序迭代:

代码语言:javascript
运行
复制
> t = {}; t[42] = 1; t[33] = 1; t[101] = 1; for k, v in pairs(t) do print(k, v) end
42  1
101 1
33  1
> t = {}; t[33] = 1; t[42] = 1; t[101] = 1; for k, v in pairs(t) do print(k, v) end
33  1
101 1
42  1

(勉强地)回答你的问题:

是在lua5.1和lua5.3之间的表中访问哈希键的顺序吗?

是。为了确保程序员不依赖遍历的顺序,许多语言(如Go)将其随机化。Lua 5.2.1 introduced randomization of seeds for hashing。这意味着现在您甚至不能依赖跨程序运行的遍历顺序。其优点是,恶意行为者也不能依赖具有特定哈希的特定密钥(因此也不能依赖给定某个插入键顺序的特定遍历顺序),从而使他们更难利用该密钥创建哈希冲突,从而损害用Lua (拒绝服务)编写的服务的可用性。

尽管如此,让我重复一遍:由于上面提到的所有要点,您应该编写代码,而不是依赖遍历的顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74136299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档