1

在我的应用程序中

<%= "a_string".hash %>

呈现为 4318227885144361583

在 Rails 控制台中:

$ rails console
Loading development environment (Rails 3.2.3)
1.9.2p290 :001 > "a_string".hash 
 => -917414088101530508 

相同的机器,相同的 rails 应用程序,相同的环境,相同的 ruby​​ 版本。

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

4

2 回答 2

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"

这将始终返回相同的结果。

于 2012-07-20T14:31:43.463 回答
1

Ruby 1.9 一直有这种行为:进入散列算法的部分信息是在每个进程的基础上随机挑选的

直到 p352 的 ruby​​ 1.8.7 版本的行为符合您的预期:字符串的哈希值仅取决于字符串的内容。

不幸的是,这为一种类型的拒绝服务攻击打开了大门:您可以选择大量的参数,这些参数都散列到相同的值,并因此会调用 ruby​​ Hash 类中的病态行为:而不是 O(1) 访问时间你会得到 O(n)。这已在 ruby​​ 1.8.7p357 中修复。这篇文章中有更多关于ruby​​ 谈话列表的详细信息。

于 2012-07-20T14:40:35.870 回答