ruby-on-rails - 为什么 Rails 的 `HashWithIndifferentAccess` 将键存储为字符串而不是符号?

标签 ruby-on-rails ruby hashmap activesupport

我正在使用 enum 将我数据库中的整数映射到我的 ruby​​ 代码中的语义值,但是我注意到它使用的键是字符串。检查hash的类型时,发现是ActiveSupport::HashWithIndifferentAccess,不是标准的Hash,这倒是有道理,但问题是为什么Rails 选择在内部将值存储和比较为字符串,而不是符号。

documentation状态:

Internally symbols are mapped to strings when used as keys in the entire writing interface

符号通常用于散列中,因为它们可以进行快速比较,但 Rails 选择使用字符串来代替。他们为什么选择这样做,性能差异有多大?

最佳答案

Why have they chosen to do this

ActiveSupport::HashWithIndifferentAccess 主要用于处理来自外部的参数。符号存储在 ruby​​ 堆中,通常不会将它们释放回系统。

在从外部获取 key 的东西中使用符号作为 key ,会导致针对 OutOfMemory 攻击的漏洞([D]DoS,使用随机生成的参数名称发送查询.) 这就是选择字符串的原因,AFAIU。如需 100% 的保证,请咨询 DHH。

how significant is the difference in performance?

使用Benchmark去检查。此站点不应是“请为我做基准测试”的站点。

关于ruby-on-rails - 为什么 Rails 的 `HashWithIndifferentAccess` 将键存储为字符串而不是符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41592312/

相关文章:

java - Integer 不是一个引用吗?为什么 inc 不更新 hashmap 值?

ruby-on-rails - RSpec:如何测试从 Controller 调用私有(private)辅助方法的辅助方法?

javascript - 设计 gem ajax post to session#create 给出了错误的错误

ruby-on-rails - 在 Ruby 中发送带有 SOAP 请求的文件

ruby - 无法解决 gem 依赖关系

ruby-on-rails - 通过 Capistrano 3 安装和启动守护程序脚本

ruby-on-rails - 为什么在安装 Ruby 1.9.3 时出现 404 错误?

ruby-on-rails - 使用 Ruby 脚本调用时如何捕获 Rake 输出?

java - 返回添加到 List<Object> 的 HashMap

java - 为什么我不能在 Java 中创建具有 'long' 类型的 HashMap?