Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么要使用字符串键对符号进行哈希_Ruby_Sinatra_Symbols - Fatal编程技术网

Ruby 为什么要使用字符串键对符号进行哈希

Ruby 为什么要使用字符串键对符号进行哈希,ruby,sinatra,symbols,Ruby,Sinatra,Symbols,这个问题应该与这个问题相反: 如您所见,每个人都同意符号是哈希键最合乎逻辑的选择。然而,我正在用sinatra框架构建一个web应用程序,请求对象是一个包含字符串作为键的散列。有人能解释为什么这是一种设计选择吗?因为查询字符串的键源是由字符串组成的,所以在该字符串中搜索键,通过字符串索引哈希最为方便 在Ruby运行时中创建的每个符号都是分配的,永远不会释放。通过发送数十万个具有唯一查询字符串参数的请求,存在一种理论上不太可能的DOS攻击。如果这些被符号化,每个请求都会缓慢地增加运行时内存池 另一

这个问题应该与这个问题相反:


如您所见,每个人都同意符号是哈希键最合乎逻辑的选择。然而,我正在用sinatra框架构建一个web应用程序,请求对象是一个包含字符串作为键的散列。有人能解释为什么这是一种设计选择吗?

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

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

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

编辑:注意,对于,符号也可用于访问参数散列。但是,这是通过创建一个由字符串索引的散列,并在发出请求时将代码中的符号转换为字符串来实现的。除非您执行以下操作:

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

…您不会面临任何符号伪DOS攻击的风险。

因为查询字符串的键源由字符串组成,因此通过此字符串搜索键,通过字符串索引哈希最为方便

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

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

编辑:注意,对于,符号也可用于访问参数散列。但是,这是通过创建一个由字符串索引的散列,并在发出请求时将代码中的符号转换为字符串来实现的。除非您执行以下操作:

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

…您不会面临任何符号伪拒绝服务攻击的风险。

请求对象包含的内容远远多于查询字符串。比如HTTP头。因为这些都是相同的,所以就内存消耗而言,符号似乎是一个更合乎逻辑的选择。另外,Rack在任何地方都使用字符串键。我想你把params和request混淆了?@MarioDeSchaepmeester是的,对不起,我以为你在使用Sinatra params对象。而不是机架请求。很抱歉造成混淆。我不知道这个请求属于Rack。这只是我有史以来的第一个ruby项目。请求对象包含的内容远远超过查询字符串。比如HTTP头。因为这些都是相同的,所以就内存消耗而言,符号似乎是一个更合乎逻辑的选择。另外,Rack在任何地方都使用字符串键。我想你把params和request混淆了?@MarioDeSchaepmeester是的,对不起,我以为你在使用Sinatra params对象。而不是机架请求。很抱歉造成混淆。我不知道这个请求属于Rack。这只是我有史以来的第一个ruby项目。请注意,使用Sinatra您可以使用。每个人都同意符号是哈希键最合乎逻辑的选择,不,它们不是。这是程序员的选择,有时是基于从众本能,但更多时候是基于当时最有意义的东西。在字符串和符号之间,我通常使用符号,但我也使用正则表达式模式甚至数组作为键,因为这是方便的。散列是一个容器,就像数组一样,可以包含各种内容。我们在那里坚持什么取决于我们,并且应该对该应用程序有意义。如果我们只讨论Sinatra中的参数散列,那么请参阅@Phrogz answer。注意,使用Sinatra可以使用。每个人都同意符号是散列键最合乎逻辑的选择,不,它们不是。这是程序员的选择,有时是基于从众本能,但更多时候是基于当时最有意义的东西。在字符串和符号之间,我通常使用符号,但我也使用正则表达式模式甚至数组作为键,因为这是方便的。散列是一个容器,就像数组一样,可以包含各种内容。我们在那里坚持什么取决于我们,并且应该对该应用程序有意义。如果我们只讨论Sinatra中的参数散列,那么请参见@Phrogz-answer。