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

我正在创建一个哈希来表示MySQL数据库中的一些记录。散列键对应于数据库ID字段,散列值对应于数据库名称字段。 什么更好&为什么? 排列 这是有效的,但Ruby似乎对稀疏数组效率低,因为看起来设置所有中间索引的值的额外开销为tp
nil
fruits = []
fruits[23] = "apple"
fruits[109] = "orange"
# ...
fruits[23429] = "banana"
使用fixnum作为键的哈希 我最喜欢这个,但我一直都认为最好使用符号作为哈希中的键。使用fixnums作为哈希中的键同样好吗?我不确定是不是,但我认为
34.hash
因为fixnums的性质,即
34.equal? 34
是真的而
"hi".equal? "hi"
是假的。
fruits = {
  23 => "apple",
  109 => "orange",
  # ...
  23429 => "banana"
}
使用固定枚举的实际字符串表示作为键的哈希值 通过将fixnums转换为字符串然后转换为符号,我可以使用符号作为键。然而,这种转换很烦人,曾经有人告诉我实习字符串是低效的。是这样吗?他们看起来很丑陋。
fruits = {
  :"23" => "apple",
  :"109" => "orange",
  # ...
  :"23429" => "banana"
}
用符号作为键的哈希 我可以通过在每个键前加上一个字母字符来获得更漂亮的符号(并使用新的Ruby 1.9哈希语法),但是,此解决方案还需要转换。
fruits = {
  i23: "apple",
  i109: "orange",
  # ...
  i23429: "banana"
}
    
已邀请:
AFAIK的推理是
symbol.hash
是常数所以在符号上调用
hash
是一个简单的属性查找并且非常快;符号针对此特定用途进行了优化。需要计算字符串的哈希值,因此在字符串上调用
hash
涉及实际工作,字符串似乎不会缓存其哈希值。 Fixnum的
hash
值似乎是通过Fixnum的内部对象ID(常量)上的一些简单位修改来计算的,所以它也应该很快。不要把这些当作权威,我只是快速回顾了1.9.2源码,但我不是Ruby内部的专家。 也就是说,我使用Fixnums作为哈希键。这为您提供了稀疏数组的自然表示,该数组在内存方面也很有效。任何速度差异都可能是无关的噪音。因此,当存在真正的速度问题时,请采用最清晰的方法并担心优化问题。     
我的建议:使用
Hash
Fixnum
键。 如你所说,这将允许稀疏对象。有适用于
Fixnum
s的特殊速度和内存优化。他们按预期进行比较并转换为一切。它应该比符号更快更简单,你不会有通常无法解析的实习字符串的陌生感。     

要回复问题请先登录注册