1

私のアプリでは

<%= "a_string".hash %>

4318227885144361583 としてレンダリング

レールコンソールで:

$ 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 のバージョンは、期待どおりに動作しました。文字列のハッシュは、文字列の内容のみに依存していました。

残念ながら、これは一種のサービス拒否攻撃への扉を開きました: すべて同じ値にハッシュ化された多数のパラメーターを選択することができ、その結果、O(1) アクセス時間の代わりに、Ruby Hash クラスで異常な動作を引き起こす可能性があります。あなたはO(n)を得るでしょう。これは ruby​​ 1.8.7p357 で修正されました。この記事の ruby​​ トークリストに詳細があります。

于 2012-07-20T14:40:35.870 に答える