哈希键是如何排序的?

时间:2015-06-02 16:50:01

标签: perl random hash key

直到today,我认为哈希键在返回时是随机的。但是,keys my %hash; $hash{$_}++ for 1 .. 100; say for keys %hash; 上的条目另有说明:

  

哈希条目以明显随机的顺序返回。实际的随机顺序特定于给定的哈希值;两个哈希值上完全相同的一系列操作可能会导致每个哈希值的顺序不同。

SO上还有其他与此相关的条目 - 最相关的是对perldoc问题的接受答案。

以下代码返回明显随机化的哈希键:

<%= pie_chart CountChatLine.summarized_channel_info %>

任何人都可以帮助我理解这不是实际随机吗?

1 个答案:

答案 0 :(得分:4)

哈希键的排序方式取决于您使用的perl版本。您不应该依赖与任何版本相关的任何看似顺序。这包括假设所涉及的任何随机化都适合用于随机性统计质量实际上很重要的其他情况。

来自5.18 Hash Overhaul

  

哈希大修

     

对perl v5.18.0中哈希实现的更改将是对现有代码行为的最明显更改之一。

     

默认情况下,具有相同键和值的两个不同哈希变量现在可以按照先前相同的顺序提供其内容。

     

当遇到这些更改时,清除它们的关键是接受哈希是无序集合并采取相应行动。

     

哈希随机化

     

Perl的哈希函数使用的种子现在是随机的。这意味着从keys(),values()和each()等函数返回键/值的顺序将因run to run而不同。

     

引入此更改是为了使Perl的哈希对算法复杂性攻击更加健壮,并且还因为我们发现它暴露了哈希顺序依赖性错误并使它们更容易被追踪。

     

工具链维护者可能希望投资额外的基础设施来测试这样的事情。连续多次运行测试然后比较结果将更容易发现代码中的哈希顺序依赖性。强烈建议作者不要将Perl哈希的关键顺序暴露给不安全的受众。

     

此外,每个哈希都有自己的迭代顺序,这使得确定当前哈希种子的内容要困难得多。