ma1*_*w28 2 ruby hash symbols key fixnum
我正在创建一个哈希来表示MySQL数据库中的一些记录.散列键对应于数据库ID字段,散列值对应于数据库名称字段.
什么更好?为什么?
排列
这是有效的,但Ruby似乎对稀疏数组效率低,因为看起来设置所有中间索引的值的额外开销是tp nil.
fruits = []
fruits[23] = "apple"
fruits[109] = "orange"
# ...
fruits[23429] = "banana"
Run Code Online (Sandbox Code Playgroud)使用fixnum作为键的哈希
我最喜欢这个,但我一直都认为最好使用符号作为哈希中的键.使用fixnums作为哈希中的键同样好吗?我不确定它是不是,但我认为34.hash因为fixnums的性质,即是真的,34.equal? 34而是"hi".equal? "hi"假的.
fruits = {
23 => "apple",
109 => "orange",
# ...
23429 => "banana"
}
Run Code Online (Sandbox Code Playgroud)使用固定枚举的实际字符串表示作为键的哈希值
通过将fixnums转换为字符串然后转换为符号,我可以使用符号作为键.然而,这种转换很烦人,曾经有人告诉我实习字符串是低效的.是这样吗?他们看起来很丑陋.
fruits = {
:"23" => "apple",
:"109" => "orange",
# ...
:"23429" => "banana"
}
Run Code Online (Sandbox Code Playgroud)用符号作为键的哈希
我可以通过在每个键前加上一个字母字符来获得更漂亮的符号(并使用新的Ruby 1.9哈希语法),但是,此解决方案还需要转换.
fruits = {
i23: "apple",
i109: "orange",
# ...
i23429: "banana"
}
Run Code Online (Sandbox Code Playgroud)我的建议:使用Hash带Fixnum钥匙.
如你所说,这将允许稀疏对象.有适用于Fixnums的特殊速度和内存优化.他们按预期进行比较并转换为一切.它应该比符号更快更简单,你不会有通常无法解析的实习字符串的陌生感.