【发布时间】:2019-08-23 10:06:12
【问题描述】:
如果我多次运行以下单行 ruby 脚本,每次都会产生不同的输出值。
puts "This is a string".hash
这里发生了什么?对于任何给定的输入字符串,我应该如何更改它以从 .hash 中获得一致的、可重现的值?
编辑:“可能重复”建议使用其他散列方法。我正在尝试重现另一个我无法控制使用 .hash 并获得一致结果的脚本的行为。更改散列方法不是一种选择。
编辑#2:正如下面另一条评论中所述,我想要重现其行为的另一个脚本位于 .exe 包装器中。它可以追溯到 2006 年,这意味着 Ruby 版本必须是 1.8.5 或更早版本。 #hash 方法在早期版本的 Ruby 中的工作方式是否有所不同,如果是,是否有人制作了复制早期版本行为的脚本? (可以使用不同的名称。)
【问题讨论】:
-
根据文档:“对象的哈希值在 Ruby 的调用或实现中可能不相同。如果您需要跨 Ruby 调用和实现的稳定标识符,则需要使用自定义生成一个方法。” ruby-doc.org/core-2.4.1/Object.html#method-i-hash你能提供更多关于什么得到一致结果的信息吗?
-
您显然使用的是 Ruby 2.3 之前的版本。该版本改变了文字的存储方式。具体来说,literals having the same value point to the same object,所以对于 v2.3+,
"This is a string".hash == "This is a string".hash #=> true。我希望对于早期版本"This is a string".freeze.hash == "This is a string".hash #=> true。你能测试一下吗? -
@CarySwoveland:仍然不能保证这个值在调用中是相同的。
-
@Jörg,是的,但我们不知道 OP 是在询问调用之间的一致性还是单个调用的一致性。