在我的应用中
<%= "a_string".hash %>
呈现为4318227885144361583
在rails console中:
$ rails console
Loading development environment (Rails 3.2.3)
1.9.2p290 :001 > "a_string".hash
=> -917414088101530508
相同的机器,相同的rails应用程序,相同的环境,相同版本的ruby。
为什么它会得到不同的值?
答案 0 :(得分:2)
这与Rails无关。
再次启动IRB并查看您在会话中获得的内容:
1.8.7 :003 > "a_string".hash
=> -1300030395
1.8.7 :004 > exit
$ irb
1.8.7 :001 > "a_string".hash
=> 1520614759
1.8.7 :002 > exit
$ irb
1.8.7 :001 > "a_string".hash
=> 1991940479
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-hash
我会提出,你很可能想做这样的事情吗?
require 'digest/md5'
Digest::MD5.hexdigest("a_string")
=> "7a0d3f5c88466513b32cee16e0620162"
这将始终返回相同的结果。
答案 1 :(得分:1)
Ruby 1.9一直有这种行为:进入散列算法的部分信息是基于每个进程随机选择的
ruby 1.8.7到p352的版本按预期方式运行:字符串的哈希值仅取决于字符串的内容。
不幸的是,这为一种拒绝服务攻击打开了大门:你可以选择大量参数,这些参数都被散列到相同的值,并因此调用ruby Hash类中的病态行为:而不是O(1 )访问时间你得到O(n)。这是在ruby 1.8.7p357中修复的。红宝石谈话列表this post中有更多详细信息。