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

时间:2011-07-21 22:54:47

标签: ruby ruby-on-rails-3 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实例。

1 个答案:

答案 0 :(得分:25)

来自Ruby forum中的Ruby dev:

  

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

     

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

     

你应该使用Digest :: SHA256或其他一些摘要例程   想要一些哈希值(消息摘要)。

从另一个开发者跟进:

  

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