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