2012-08-29 24 views
3
# pry/irb example #1 
"abc".hash 
=> -1883761119486508070 
"abc".hash 
=> -1883761119486508070 

# pry/irb example #2 
"abc".hash 
=> -4309321811150053495 
"abc".hash 
=> -4309321811150053495 

hash值對於特定的調用是恆定的,但是在調用之間會有所不同。爲什麼?這是設計嗎?這被認爲是一件「好事」?爲什麼Ruby的散列方法在運行期間會有所不同?

我正在運行ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]

回答

7

http://patshaughnessy.net/Ruby-Under-a-Microscope-Rough-Draft-May.pdf

23頁下面是Ruby的哈希函數實際上是如何工作的... [剪斷] ...對於字符串,它的工作方式不同陣列。在這種情況下,Ruby實際上遍歷數組中字符串 的所有 並計算累積散列值;這保證了對於字符串或數組的任何實例而言,散列值總是相同的,並且如果該字符串或數組中的任何值發生更改,該值始終會更改。

和:

此外,紅寶石1.9和Ruby 2.0使用隨機種子值,它是 每次重新啓動時間紅寶石重新初始化初始化murmur哈希。這意味着如果您停止並重新啓動Ruby,則 將爲相同的輸入數據獲取不同的哈希值。這也意味着如果你自己嘗試這個 你會得到不同於我以上的值。但是,同一個Ruby進程中的哈希值將始終爲 。

+0

生成散列時的隨機種子對安全性更好。我不記得我在哪看到這個,但我幾乎肯定這就是爲什麼會發生這種情況。 –

+1

以下是官方漏洞公告的鏈接 http://www.ruby-lang.org/zh/news/2011/12/28/denial-of-service-attack-was-found-for-rubys-hash -algorithm-CVE-2011-4815 / – Yossi

相關問題