2012-07-20 67 views
1

在我的應用程序爲什麼散列方法在rails控制檯中返回不同的值?

<%= "a_string".hash %> 

呈現爲4318227885144361583

在軌控制檯:

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

同一臺機器,同樣的Rails應用程序,同樣的環境,同樣版本的紅寶石。

它爲什麼會得到不同的值?

回答

1

Ruby 1.9的一直有這種行爲:那進入散列算法對每個進程的基礎是隨機挑選的紅寶石1.8.7

版本到P352的表現你所期望的方式提供信息的部分:字符串的散列只取決於字符串的內容。不幸的是,這爲一種拒絕服務攻擊打開了大門:你可以選擇大量的參數,這些參數都散列到相同的值,並且會在ruby Hash類中調用病態行爲:而不是O( 1)訪問時間你會得到O(n)。這已被固定在紅寶石1.8.7p357。 this post在ruby talk列表中有更多詳細信息。

+0

謝謝,一旦你知道了,這就完美了! – DanSingerman 2012-07-20 15:16:18

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" 

這將始終返回相同的結果。

相關問題