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

今天在我们正在多台服务器上部署的应用程序中遇到了这个问题。 我正在散列一些字符串以存储在共享键/值存储中。 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 

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

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

它的目的是。 Ruby 1.9显式使用会话本地随机种子来计算字符串(以及一些其他对象)的哈希值。

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

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

并从另一个开发者跟进:

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