为什么Ruby String.hash跨机器不一致?

Bra*_*rad 25 ruby hash ruby-on-rails-3

今天在我们正在多台服务器上部署的应用程序中遇到了这个问题.我正在散列一些字符串以存储在共享键/值存储中.String的.hash方法根据服务器返回不同的整数.有什么想法吗?请注意,我感兴趣的原因 ; 不可能的工作.

例:

server1 $ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

server1 $ irb
irb(main):001:0> "test".hash
=> 4146582576695053125


server2 $ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

server2 $ irb
"test".hash
=> 3479379392688537032
Run Code Online (Sandbox Code Playgroud)

这些机器是EC2实例,具有相同的规格和构建.

Gar*_*ies 25

来自Ruby论坛中的Ruby开发人员:

它的目的是.Ruby 1.9明确使用会话本地随机种子来计算字符串(和一些其他对象)的哈希值.

这是因为Object#hash的实现在版本(如1.9.1和1.9.2)和实现(如JRuby,Rubinius,IronRuby等)之间是不同的.我们希望人们围绕Object#hash编写可移植代码,所以我们这样做了.

当您需要一些哈希值(消息摘要)时,您应该使用Digest :: SHA256或其他一些摘要例程.

并从另一个开发者跟进:

此外,它有助于避免一些拒绝服务攻击,例如使用具有相同哈希码的用户名注册成百上千的用户.