2

我正在创建一个散列来表示 MySQL 数据库中的一些记录。散列键对应于数据库 ID 字段,散列值对应于数据库名称字段。

什么更好,为什么?

  1. 大批

    这行得通,但是 Ruby 对于稀疏数组似乎效率低下,因为设置所有中间索引 tp 的值似乎有额外的开销nil

    fruits = []
    fruits[23] = "apple"
    fruits[109] = "orange"
    # ...
    fruits[23429] = "banana"
    
  2. 以 fixnum 为键的散列

    我最喜欢这个,但我一直认为最好在哈希中使用符号作为键。使用 fixnums 作为哈希中的键是否同样好?我不确定它是否是,但我认为34.hash由于 fixnums 的性质,34.equal? 34即为真而"hi".equal? "hi"为假。

    fruits = {
      23 => "apple",
      109 => "orange",
      # ...
      23429 => "banana"
    }
    
  3. 以固定数字的内部字符串表示作为键的散列

    通过将 fixnums 转换为字符串然后是符号,我可以将符号用作键。然而,这种转换很烦人,有人曾经告诉我,字符串的实习效率很低。是这样吗?他们只是在我看来很难看。

    fruits = {
      :"23" => "apple",
      :"109" => "orange",
      # ...
      :"23429" => "banana"
    }
    
  4. 以符号为键的散列

    我可以通过在每个键前面加上一个字母字符来获得更漂亮的符号(并且还使用新的 Ruby 1.9 哈希语法),但是,这个解决方案还需要转换。

    fruits = {
      i23: "apple",
      i109: "orange",
      # ...
      i23429: "banana"
    }
    
4

2 回答 2

5

我的建议:使用HashFixnum键。

正如您所说,这将允许稀疏对象。有适用于Fixnums 的特殊速度和内存优化。他们按预期进行比较并转换为所有内容。它应该比符号更快更简单,并且您不会有通常无法解析的实习字符串的奇怪之处。

于 2011-03-30T17:21:36.933 回答
2

AFAIK 的原因是它symbol.hash是恒定的,因此调用hash符号是一个简单的属性查找并且非常快;符号针对此特定用途进行了优化。需要计算字符串的哈希值,因此调用hash字符串涉及实际工作,并且字符串似乎不会缓存其哈希值。Fixnum的hash值似乎是通过对 Fixnum 的内部对象 ID(一个常量)进行一些简单的位修改来计算的,因此它也应该很快。不要把这些当作权威,我只是快速回顾了 1.9.2 的源代码,但我几乎不是 Ruby 内部的专家。

也就是说,我会使用 Fixnums 作为哈希键。这为您提供了一个稀疏数组的自然表示,该数组在内存方面也很有效。任何速度差异都可能是无关紧要的噪音。因此,当存在真正的速度问题时,请采用最清晰的方法并担心优化。

于 2011-03-30T18:06:29.677 回答