【问题标题】:How is Hash in Ruby implemented internally? What data structure/algorithm Hash is using? [closed]Ruby 中的 Hash 是如何在内部实现的? Hash 使用的是什么数据结构/算法? [关闭]
【发布时间】:2014-03-01 21:39:24
【问题描述】:

我知道在 Java 语言中,HashMap 是最常用来实现像 Ruby Hash 这样的功能。 Java HashMap 正在使用名为“separate chaining with linked lists”的数据结构:http://en.wikipedia.org/wiki/Hash_table

在哪里可以找到 Ruby 哈希的实现? RubyHash使用的是什么数据结构和算法?

【问题讨论】:

  • 这是一个“教我 Ruby”的问题,它在 StackOverflow 上是题外话,因为它太宽泛了。我建议遵循 Ruby 教程。
  • @MarkThomas 我已经编辑了我的问题,它不是关于“教我 Ruby,如何使用 Hash”的问题,我的目的是尝试了解 Ruby Hash 正在使用什么数据结构和算法。你能帮忙重新打开这个问题吗?
  • 如果您想了解它是如何实现的,请试试 Tealeaf Academy 的这篇文章:gotealeaf.com/blog/how-the-hash-works-in-ruby 或 Pat Shaughnessy 的书《显微镜下的红宝石》的精彩示例章节:patshaughnessy.net/Ruby-Under-a-Microscope-Rough-Draft-May.pdf
  • 2.4 中实现的重写。作者在一篇博文中很好地解释了它:developers.redhat.com/blog/2017/02/27/…

标签: ruby arrays data-structures hashtable


【解决方案1】:

请在documentation查看,只需选择方法,然后点击链接:click to toggle source,它会显示您的来源。

  1. ::[]单例方法:

                   static VALUE
    rb_ary_s_create(int argc, VALUE *argv, VALUE klass)
    {
        VALUE ary = ary_new(klass, argc);
        if (argc > 0 && argv) {
            ary_memcpy(ary, 0, argc, argv);
            ARY_SET_LEN(ary, argc);
        }
    
        return ary;
    }
    
  2. #[]实例方法。

  3. Hash 类)的 ::[] 单例方法。

  4. Hash 类)的#[] 实例方法。

代码表示零大小的 将分配给arr 变量:

arr = []
arr
# => []

Hash 类)的默认大小为 0

# Array
[].size
# => 0
Array.new.size
# => 0

# Hash
{}.size
# => 0
Hash.new.size
# => 0

【讨论】:

  • 我认为 3 将是Hash::[]
  • @ArupRakshit thanx,那是 copypasta =)
  • 嘿嘿嘿 :) 我知道.. =)
  • 谢谢,所以如果使用arr = Array.new(10000)这样的东西,如果我们知道数组的大小以避免重新调整大小的操作,但是Ruby Hash没有提供任何方法来根据@987654333初始化哈希表大小@
  • @coderz 不完全是,使用Array.new(10000) 您只需使用默认值初始化Array。一般nil。但您仍然可以访问或设置为arr[10002]
【解决方案2】:

这些会有帮助吗?

http://www.ruby-doc.org/core-2.1.0/Array.html#method-c-new

arr = []arr = Array.new(0, nil) 相同,其中 0 是数组的大小。

单击切换源并向下滚动以查看代码。

Hash 也一样,查看文档:

http://www.ruby-doc.org/core-2.1.0/Hash.html

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多