为什么会使用String键作为符号的哈希值

时间:2013-04-25 17:14:44

标签: ruby sinatra symbols

这个问题应与此问题相反:Why use symbols as hash keys in Ruby?

如您所见,每个人都同意符号是哈希键的最合理选择。但是,我正在使用sinatra框架构建Web应用程序,request对象是包含String s作为键的哈希。任何人都可以解释为什么这将是一个设计选择?

1 个答案:

答案 0 :(得分:4)

因为键的来源 - 查询字符串 - 由字符串组成,所以在字符串中搜索键,通过字符串索引哈希是最方便的。

在Ruby运行时中创建的每个Symbol都被分配并且永不释放。通过使用唯一查询字符串参数发送数十万个请求,可以获得理论上(但不太可能)的DOS攻击。如果这些是符号化的,那么每个请求都会慢慢增加运行时内存池。

另一方面,字符串可能是垃圾回收。在各种请求中处理的数千个独特字符串最终会消失,不会产生长期影响。

修改:请注意,对于Sinatra,符号也可用用于访问params哈希。但是,这是通过创建一个由字符串索引的哈希,并在您发出请求时将符号(在您的代码中)转换为字符串来完成的。除非您执行以下操作:

params.each{ |key,_| key.to_sym }

...您没有任何符号伪DOS攻击的风险。