用单词索引读取lua表给出随机顺序

时间:2013-04-08 06:24:00

标签: lua indexing lua-table

以下是用于读取带有单词索引的表的lua代码。 将其读入另一个表并在输出中打印它会在每次运行时产生随机顺序。

earthquakes = {
        date8 = "1992/01/17",
        date7 = "1971/02/09",
        date6 = "2010/04/04",
        date5 = "1987/10/19"
}
sf = string.format
earthquake_num ={}

for k, v in pairs(earthquakes) do
        table.insert(earthquake_num, {key=k,value=v})
end

for i, v in pairs (earthquake_num) do
print(sf(" row %d key = %s", i, v.value))
end

输出: 每次都以不同的顺序

3 个答案:

答案 0 :(得分:2)

这是Lua 5.2.1的special feature :-)
但是这个功能的用途是什么呢? 无论如何,您不应该依赖pairs函数生成的排序。


编辑:
引入此功能是为了在使用Lua的Web服务器上对抗hash collision attacks 随机哈希算法可以防止使用相等的哈希值轻松生成字符串 由pairs函数生成的表键的排序取决于字符串类型键的字符串哈希,因此字符串键恰好在每次程序运行时都会混淆。

答案 1 :(得分:2)

来自Lua PiL的迭代器:

  

迭代表中所有元素的pairs函数是   类似的,除了迭代器函数是下一个函数,其中   是Lua中的一个原始函数:

function pairs (t)
  return next, t, nil
end
     

调用next(t,k),其中k是表t的键,返回下一个键   在表格中, 以任意顺序 。 (它还返回   与该键关联的值,作为第二个返回值。)调用   next(t,nil)返回第一对。当没有更多配对时,接下来   返回nil。

next状态的枚举:

  

next (table [, index])

     

未指定枚举索引的顺序,   的 even for numeric indices 即可。 (要按数字顺序遍历表,请使用数字或ipairs函数。)

答案 2 :(得分:0)

正如Egor所说,对迭代器以任意顺序返回表值。要对数据进行排序并以有序格式返回,您需要使用ipairs,例如

earthquakes = {
        date8 = "1992/01/17",
        date7 = "1971/02/09",
        date6 = "2010/04/04",
        date5 = "1987/10/19"
}
sf = string.format
earthquake_num ={}

for k, v in pairs(earthquakes) do
        table.insert(earthquake_num, {key=k,value=v})
end
table.sort(earthquake_num,function(a, b) return a.value < b.value end)
for i, v in ipairs (earthquake_num) do
print(sf(" row %d key = %s", i, v.value))
end

有关详细信息,请参阅lua: iterate through all pairs in table