2

这个问题应该与这个问题相反:为什么在 Ruby 中使用符号作为哈希键?

如您所见,每个人都同意符号是哈希键最合乎逻辑的选择。但是,我正在使用 sinatra 框架构建一个 Web 应用程序,并且该request对象是一个包含Strings 作为键的哈希。谁能解释为什么这将是一种设计选择?

4

1 回答 1

4

因为键的来源——查询字符串——是由字符串组成的,所以在这个字符串中搜索键,通过字符串索引散列是最直接方便的。

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

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

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

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

...您不会受到任何符号伪 DOS 攻击的风险。

于 2013-04-25T17:19:01.097 回答