如何不在lua中将数组变成哈希(防止数组变成哈希)?

Posted

技术标签:

【中文标题】如何不在lua中将数组变成哈希(防止数组变成哈希)?【英文标题】:How to not to turn array into hash in lua (prevent array become hash )? 【发布时间】:2014-09-26 13:11:42 【问题描述】:

如果我用 Lua 编写

local var = 1,2,3,4,5,6

变量var是数组。

如果我想将其保留为数组(而不是哈希),我必须使用 table.insert、table.remove 等。

这段代码会把它变成哈希:

var["key"] = 4

问题: 此代码是否将数组变量转换为哈希?

local var = 1,2,3,4,5
var[4] = "string"
var[6] = "string"
var[1] = "string"

【问题讨论】:

您不必强制使用 table.insert 等。 【参考方案1】:

正如其他人已经指出的那样,Lua 只有表。在内部,您放入表中的值可能存储在其数组或哈希部分中,但这是用户无需担心的实现细节。

在您的特定情况下,键将仅存储在数组部分中(即使在分配之后),因为您没有创建任何新键。根据Lua Performance Tips(“关于表”部分)中的详细描述,初始分配将在数组部分分配 6 个插槽,然后您只需重新分配这些插槽。如果您添加var[7] = "string",则此值将进入散列部分,这将触发重新散列,因为此时散列部分的大小为 0。 Lua 将计算需要多少个槽来容纳数组部分中的所有值(现在为 7 个),并“选择数组部分的大小为 2 的最大幂,以便填充数组部分的一半以上元素”。数组部分现在将有 8 个插槽,而哈希部分的大小仍然为 0,因为没有元素可以去那里。

问题:这段代码是否将数组变量转换为哈希?

所以这个问题的答案是“否”(如果“变成散列”是指表得到一个非零散列部分)。如果你做var[8] = "string"(没有分配var[7]),散列部分的大小将非零,但如果你稍后再做var[7] = "string",这将触发另一个重新散列,因为这个元素不适合散列部分,所有这些元素将再次分配给数组部分。

Lua 正在努力为表格中的元素保留最合适的结构,但结构本身的更改仅在重新散列期间完成。

【讨论】:

谢谢! @paul-kulchenko 最好的答案!还有一个问题....如果我写:local var = ; for i = 1, 10000, 1 do table.insert ( var, i ) end; var[5] = some = false, another = 2 ; var[888] = @userdata; var[10000] = ; var[1] = 1 这将由 var hash 生成还是仍将是类似数组的表? (“;”符号是分开的)(我认为答案是“否”,因为正如你所写的那样,它不会触及表格的结构......这是对的吗?) 没错;您仅更改数组部分中各种元素的值,而不会更改表的结构。您可以在表中存储各种类型的值(Lua 支持的所有类型)。【参考方案2】:

您试图区分 Lua 中不存在的“数组”和“哈希”。都是桌子。其中一些只是具有并非都是正整数的键。

【讨论】:

以上是关于如何不在lua中将数组变成哈希(防止数组变成哈希)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在PowerShell中将哈希字符串转换为字节数组?

URAL-1989 树状数组+字符串哈希

如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?

如何在laravel中将集合变成数组

在 Clojure 中将元组数组转换为哈希映射

如何防止因哈希碰撞引起的DoS攻击