Perl是否保证返回顺序一致的散列键?

Perl是否保证返回顺序一致的散列键?,perl,hash,key,Perl,Hash,Key,考虑到 foreach (keys %myHash) { ... do stuff ... } foreach (keys %myHash) { ... do more stuff ... } 如果哈希值没有改变,Perl是否保证以一致的顺序迭代键?。发件人: 钥匙显然是按随机顺序返回的。实际的随机顺序可能会在未来的perl版本中发生更改,但它保证与值或每个函数生成的顺序相同(假定哈希未被修改)。由于Perl 5.8.1,出于安全原因,即使在不同的Perl运行之间,顺序也是不同的

考虑到

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

foreach (keys %myHash) {
   ... do more stuff ...
}
如果哈希值没有改变,Perl是否保证以一致的顺序迭代键?

。发件人:

钥匙显然是按随机顺序返回的。实际的随机顺序可能会在未来的perl版本中发生更改,但它保证与
每个
函数生成的顺序相同(假定哈希未被修改)
。由于Perl 5.8.1,出于安全原因,即使在不同的Perl运行之间,顺序也是不同的(请参阅中的“算法复杂性攻击”)


(强调我的)

这是一个相当危险的期望。也许会,但为什么要担心呢?提前获取密钥,保存结果,然后迭代保存的结果。然后,保证您以相同的顺序访问密钥。在未指明的实现细节边缘工作是危险的

编辑:错过了文件中的“保证”,但我仍然认为期待这永远不会改变是危险的。尤其是当有更明智的方法达到同样的目的时。

编辑:

虽然普通散列具有一致的顺序,但在一种情况下,键的顺序定义不明确,因为它是由用户控制的


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

也许您可以一次而不是两次处理散列

您应该将散列键保存到数组中作为一种防御性编程实践,除非数据的大小足够大,以至于复制它会成为一个问题。作为奖励,您甚至可以轻松地对列表进行排序,并以定义良好的顺序在散列中进行处理。例如:

   my @keys = sort keys %myHash;
这避免了修改散列的任何问题,因为除非您愿意,否则数组顺序永远不会改变


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

+1如果人们至少尝试阅读Perl附带的优秀文档,那就太好了。为什么恐慌中会引用“保证”一词?这是(a)非常清楚的陈述;(b) 不太可能更改,因为
以相同的顺序返回很重要,这样当您无法使用
每个
时,这两个键可以相互关联。我不明白-为什么您要对一个经过测试、记录并因此保证工作的功能进行防御?这看起来就像使用文本编辑器并连续两次调用File->Safe,希望第一次失败后第二次成功一样愚蠢。@moritz:问题不在于Perl是否更改了密钥顺序,而在于如果修改了散列,则顺序可以更改。这个答案暗示了一种防御性的编程策略(单独的数组加只读),用于将来维护OP的代码库,与Perl内部无关。被隐式地期望某个顺序的代码咬得太多,当看似不相关的更改导致不同的键顺序时,代码开始神秘地失败。只是出于好奇——你需要这个属性做什么?谁在否决一切?