【问题标题】:How are hash keys sorted?哈希键是如何排序的?
【发布时间】:2016-02-19 00:11:00
【问题描述】:

直到today,我认为哈希键在返回时是随机的。但是,keys 上的 perldoc 中的条目另有说明:

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

SO 上还有其他与此相关的条目 - 最相关的是this 问题的公认答案。

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

 my %hash;
 $hash{$_}++ for 1 .. 100; 

 say for keys %hash;

谁能帮我理解这不是实际上随机的吗?

【问题讨论】:

  • IIRC,随机化旨在(仅?)在发生碰撞时启动,以尽量减少对效率的影响。我会尝试挖掘相关的邮件列表讨论。
  • 这是我尝试回答问题的一个不太复杂的版本Why do the same hash keys have different order when printing? TL:DR:在 perl-5.18 之后,您可以通过多种方式控制行为以及默认设置的许多充分理由 :-)

标签: perl random hash key


【解决方案1】:

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

来自5.18 Hash Overhaul

哈希大修

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

默认情况下,具有相同键和值的两个不同散列变量现在可以按以前相同的不同顺序提供它们的内容。

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

哈希随机化

Perl 的散列函数使用的种子现在是随机的。这意味着从 keys()、values() 和 each() 等函数返回的键/值的顺序将因运行而异。

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

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

此外,每个散列都有自己的迭代顺序,这将使确定当前散列种子是什么变得更加困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2012-03-06
    • 2011-08-12
    • 2012-08-17
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多