7

我对来自 ruby​​ 的“哈希”方法有疑问:http: //apidock.com/ruby/v1_8_7_330/Hash/hash

我使用它来比较具有相同内容的两个不同对象,以查找数据库对象和具有相同属性的新元素之间的冲突。

它显然已经工作了很长时间(超过一年),但它突然停止在我的开发计算机中工作。

如果我在 Rails 控制台中尝试这个:

a = {:a => 'a', :b=>'b'}
b = {:a => 'a', :b=>'b'}
a.hash
b.hash

-3820017043059270405我在同一个控制台中为 a.hash 和 b.hash ( ) 获得了相同的值。-1865824882785682267问题是,如果我更改为另一个控制台,它会返回与第一个控制台 ( )不同的值。

它不应该返回相同的哈希吗?

提前致谢。

编辑:由于 ree 1.8.7 版本,它在生产中运行良好。

4

2 回答 2

7

不,不应该!

不同的 Ruby 实现(如 jRuby、Rubinius、MRI 1.8.x、MRI 1.9.x 等)使用不同的方式来生成哈希。例如,对于某些对象(例如您拥有的类或 Hash 实例),运行时将在创建此对象时分配 uniq 和随机 id。如果我没记错的话,MRI 紧密使用基于内存地址的哈希:http ://rxr.whitequark.org/mri/source/gc.c?v=1.8.7-p370#2111

因此,您不能保证每次运行代码都会使用相同的随机值或相同的内存地址。

我还建议使用 ruby​​-doc 而不是 apidock 用于 Ruby 内部:http ://ruby-doc.org/core-2.0/Object.html#method-i-hash

对象的哈希值在 ruby​​ 的调用或实现中可能不同。如果您需要跨 ruby​​ 调用和实现的稳定标识符,则需要使用自定义方法生成一个。

希望对您有所帮助!

于 2013-03-15T11:57:10.950 回答
2

来自:http ://ruby-doc.org/core-2.0/Object.html#method-i-hash

对象的哈希值在 ruby​​ 的调用或实现中可能不同。如果您需要跨 ruby​​ 调用和实现的稳定标识符,则需要使用自定义方法生成一个。

虽然这是来自 Ruby 2.0 的文档,但我相信这种情况已经有一段时间了——也就是说,一般来说,你不能保证使用 .eql 的 Ruby 对象是等价的?将在不同的 Ruby 进程中计算出相同的哈希值。

当您调用 Hash.hash 时,我的理解是,它返回从用作键的对象和哈希对象中的值计算的哈希值的组合,因此受制于相同的文档。

于 2013-03-15T11:43:41.153 回答