为什么Ruby String.hash在不同的机器上不一致?

为什么Ruby String.hash在不同的机器上不一致?,ruby,ruby-on-rails-3,hash,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 => 414658257

今天,我们在多台服务器上部署的应用程序中遇到了这个问题。我正在散列一些字符串以存储在共享键/值存储中。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 1.9显式使用会话本地随机种子 计算字符串(和其他一些对象)的哈希值

这是因为对象散列的实现不同于 版本(如1.9.1和1.9.2)和实现(如JRuby、, Rubinius、IronRuby等)。我们希望人们编写可移植代码 围绕对象散列,所以我们这样做了

您应该使用Digest::SHA256或其他一些摘要例程 需要一些散列值(消息摘要)

以及其他开发人员的后续行动:

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


我们想知道您是否也可以在
irb
中显示
RUBY\u版本的值。例如:
RUBY-1.9.2-p290:002>RUBY\u版本=>“1.9.2”
irb(main):001:0>RUBY\u版本=>“1.9.2”
,因为有什么特别的原因期望它们相同?由于它们是EC2实例,它们是否运行相同的映像?我相信它们是相同的映像,但我没有设置它们。我之所以认为它们是一致的,主要是因为我使用.hashCode的java经验。此外,在String.hash文档中没有提到它们的不一致性。是的,我的“变通方法”是使用摘要,但这看起来很奇怪,因为更多的是Java背景。