我的问题是为什么表tt中的键和值(512)不一样:
我有相同的lua代码:
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章:
发布于 2022-10-20 08:03:52
发布于 2022-10-20 08:31:36
正如Ivo所指出的,您应该永远不要依赖于哈希表遍历的确定性顺序。
这非常容易破坏(1)跨解释器,(2)跨不同的Lua版本,这可能会影响哈希函数的实现细节。
此外,在实践中,散列部分的顺序通常取决于插入顺序--也就是说,两个表可能具有相同的键,但由于另一个插入/删除操作序列,pairs
/next
不必按相同的顺序迭代:
> 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 (拒绝服务)编写的服务的可用性。
尽管如此,让我重复一遍:由于上面提到的所有要点,您应该编写代码,而不是依赖遍历的顺序。
https://stackoverflow.com/questions/74136299
复制相似问题