今天在我们正在多台服务器上部署的应用程序中遇到了这个问题。我正在散列一些字符串以存储在共享键/值存储中。 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实例。
答案 0 :(得分:25)
来自Ruby forum中的Ruby dev:
意图。 Ruby 1.9显式使用会话本地随机种子 计算字符串(以及其他一些对象)的哈希值。
这是因为Object#hash的实现之间是不同的 版本(如1.9.1和1.9.2)和实现(如JRuby, Rubinius,IronRuby等等。我们希望人们编写可移植的代码 围绕Object#hash,所以我们这样做了。
你应该使用Digest :: SHA256或其他一些摘要例程 想要一些哈希值(消息摘要)。
从另一个开发者跟进:
此外,它有助于避免一些拒绝服务攻击,例如 使用具有的用户名注册成百上千的用户 相同的哈希码。