“哈希按照插入相应键的顺序枚举它们的值。”

时间:2017-03-08 10:34:34

标签: ruby hash enumeration

来自http://ruby-doc.org/core-2.4.0/Hash.html#method-i-each的红宝石文档:

  

哈希按照插入相应键的顺序枚举其值。

通常,我希望以随机顺序枚举哈希(用任意语言)。

ruby​​如何设法跟踪插入顺序?除了哈希桶之外,它是否在密钥之间保留链表?我想这会非常简单,但我真的很惊讶(以一种好的方式)他们首先做到了。

2 个答案:

答案 0 :(得分:3)

是的,它保留了一个链表。这可以在不影响典型散列表的典型O(1)摊销的最坏情况步骤复杂度保证的情况下完成,因为使链接列表昂贵的所有操作(例如,删除元素)与需要按顺序遍历列表相关。 找到元素,但在这种特殊情况下,"发现"通过使用哈希表查找可以使部分短路。

如果您对Ruby实现的内部感兴趣,我建议您阅读Rubinius源代码;它比YARV更清晰,更容易阅读,而且,它是用Ruby编写的,这是一种你已经熟悉的语言。 Rubinius的Hash课程在core/hash.rb中实施。请注意,当前版本的Rubinius使用Hash Array Mapped Trie (HAMT),这与YARV使用的简单传统哈希表有很大不同,但这与使用附加链表无关。如果你真的想,你可以看一下仍然有传统哈希表的older version

答案 1 :(得分:1)

这个forum有你正在寻找的确切答案,Matz本人也会回答。

  

有人可以解释为什么添加此功能吗?

     

对某些情况很有用,特别是对于关键字参数。

     

这不会减慢Hash上的操作吗?

     

没有。哈希引用操作仅接触订单信息   用于迭代。内存消耗略有增加。