使用fixnums作为Ruby哈希中的键是否合适?

ma1*_*w28 2 ruby hash symbols key fixnum

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

什么更好?为什么?

  1. 排列

    这是有效的,但Ruby似乎对稀疏数组效率低,因为看起来设置所有中间索引的值的额外开销是tp nil.

    fruits = []
    fruits[23] = "apple"
    fruits[109] = "orange"
    # ...
    fruits[23429] = "banana"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用fixnum作为键的哈希

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

    fruits = {
      23 => "apple",
      109 => "orange",
      # ...
      23429 => "banana"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用固定枚举的实际字符串表示作为键的哈希值

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

    fruits = {
      :"23" => "apple",
      :"109" => "orange",
      # ...
      :"23429" => "banana"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用符号作为键的哈希

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

    fruits = {
      i23: "apple",
      i109: "orange",
      # ...
      i23429: "banana"
    }
    
    Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 5

我的建议:使用HashFixnum钥匙.

如你所说,这将允许稀疏对象.有适用于Fixnums的特殊速度和内存优化.他们按预期进行比较并转换为一切.它应该比符号更快更简单,你不会有通常无法解析的实习字符串的陌生感.