Perl是否保证返回一致排序的哈希键?

时间:2009-08-10 18:39:57

标签: perl hash key

给出类似

的内容
foreach (keys %myHash) {
   ... do stuff ...
}

foreach (keys %myHash) {
   ... do more stuff ...
}

如果散列没有改变,Perl是否保证以一致的顺序迭代键?

3 个答案:

答案 0 :(得分:26)

Yes。来自perldoc -f keys

  

键以明显随机的顺序返回。实际的随机顺序可能会在将来的perl版本中发生变化,但保证与valueseach函数产生的顺序相同(假设哈希值未发生)修饰的)即可。从Perl 5.8.1开始,出于安全原因,即使在不同的Perl运行之间,顺序也不同(参见perldoc perlsec中的“算法复杂性攻击”)。

(强调我的)

答案 1 :(得分:0)

修改

虽然普通哈希具有一致的排序,但在tied hash的情况下,键的顺序是 没有明确定义 ,因为它是用户-controlled!


虽然散列键顺序没有改变,但您可能应该重新考虑为什么需要这样做。

也许你可以一次传递而不是两次传递哈希?

您应该将哈希键保存到数组中作为防御性编程实践,除非数据的大小足以复制它将是一个问题。作为奖励,您甚至可以轻松地对列表进行排序,并以明确定义的顺序处理哈希值。如,

   my @keys = sort keys %myHash;

这可以避免修改哈希值时出现任何问题,因为除非你想要,否则你的数组顺序永远不会改变。

如果你不这样做,你需要非常小心,不要做任何改变哈希的事情,否则元素的顺序会改变。查看Readonly模块以确保永远不会修改此哈希。

答案 2 :(得分:-2)

这是一个非常冒险的期望。它可能会,但为什么要担心?提前获取密钥,保存结果,然后迭代保存的结果。然后,您可以保证以相同的顺序访问密钥。解决未指定的实现细节的边缘是危险的。

编辑:错过了文档中的“保证”,但我仍然认为期望永远不会改变是危险的。特别是当有更好的方法来达到同样的目的时。