【问题标题】:Why is Ruby String.hash inconsistent across machines?为什么 Ruby String.hash 跨机器不一致?
【发布时间】:2011-10-10 15:50:44
【问题描述】:

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

【问题讨论】:

  • 我们想知道您是否还可以在irb 中显示RUBY_VERSION 的值。
  • 例如:ruby-1.9.2-p290 :002 > RUBY_VERSION => "1.9.2"
  • irb(main):001:0> RUBY_VERSION => "1.9.2" 对于两者
  • 期望它们相同的任何特殊原因?由于它们是 EC2 实例,它们是否运行相同的映像?
  • 我相信它们是相同的图像,但我没有设置它们。我认为它们保持一致的主要理由来自我对 .hashCode 的 Java 经验。此外,在 String.hash 文档中没有提到它们不一致。

标签: ruby ruby-on-rails-3 hash


【解决方案1】:

来自Ruby forum 中的 Ruby 开发人员:

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

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

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

以及来自另一个开发者的跟进:

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

【讨论】:

  • 是的,我的“解决方法”是使用 Digest,但这似乎很奇怪,因为它更多地是 Java 背景。
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多