ruby中相同对象值的不同哈希值

时间:2013-03-15 11:38:54

标签: ruby-on-rails ruby

我遇到了ruby的“hash”方法的问题: 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

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

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

提前致谢。

编辑:由于ree 1.8.7版本,它在制作方面表现良好。

2 个答案:

答案 0 :(得分:6)

不,它不应该!

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

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

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

  

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

希望它会对你有所帮助!

答案 1 :(得分:1)

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

  

对象的哈希值在调用之间可能不相同   或者ruby的实现。如果你需要一个稳定的标识符   您将需要生成一个ruby调用和实现   使用自定义方法。

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

当你调用Hash.hash时,我的理解是这会返回一个组合的哈希值,这些哈希值是根据哈希对象中用作键和值的对象计算出来的,因此需要使用相同的文档