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

zap*_*ico 6 ruby ruby-on-rails

我有一个来自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
Run Code Online (Sandbox Code Playgroud)

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

是不是应该返回相同的哈希

提前致谢.

编辑:由于ree 1.8.7版本,它在生产方面表现良好.

小智 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#21111

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

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

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

希望它能帮到你!