这个问题应该与这个问题相反:为什么在 Ruby 中使用符号作为哈希键?
如您所见,每个人都同意符号是哈希键最合乎逻辑的选择。但是,我正在使用 sinatra 框架构建一个 Web 应用程序,并且该request
对象是一个包含String
s 作为键的哈希。谁能解释为什么这将是一种设计选择?
这个问题应该与这个问题相反:为什么在 Ruby 中使用符号作为哈希键?
如您所见,每个人都同意符号是哈希键最合乎逻辑的选择。但是,我正在使用 sinatra 框架构建一个 Web 应用程序,并且该request
对象是一个包含String
s 作为键的哈希。谁能解释为什么这将是一种设计选择?
因为键的来源——查询字符串——是由字符串组成的,所以在这个字符串中搜索键,通过字符串索引散列是最直接方便的。
在 Ruby 运行时创建的每个 Symbol 都被分配并且永远不会被释放。通过发送具有唯一查询字符串参数的数十万个请求,理论上存在(但不太可能)DOS 攻击。如果这些是符号化的,每个请求都会慢慢增加运行时内存池。
另一方面,字符串可能会被垃圾收集。在各种请求中处理的数千个唯一字符串最终会消失,不会产生长期影响。
编辑:请注意,使用Sinatra,符号也可用于访问params
哈希。但是,这是通过创建一个由字符串索引的哈希,并在您发出请求时将符号(在您的代码中)转换为字符串来完成的。除非您执行以下操作:
params.each{ |key,_| key.to_sym }
...您不会受到任何符号伪 DOS 攻击的风险。