为什么hash方法在rails控制台中返回不同的值?

时间:2012-07-20 14:09:17

标签: ruby-on-rails-3

在我的应用中

<%= "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。

为什么它会得到不同的值?

2 个答案:

答案 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中有更多详细信息。