我陷入了这样的问题。我尝试在rspec测试中比较2种哈希值:
describe 'sort tests' do
let(:actual) do
{
1 => { users: { 1 => { id: 1,accounts: [1],profit: 10,revenue: 1,loss: 9 },2 => { id: 2,accounts: [2,3,6],profit: -24,revenue: 6,loss: -30 } },total_profit: -14,total_revenue: 7,total_loss: -21 },2 => { users: { 3 => { id: 3,accounts: [4,5],profit: 27,revenue: 9,loss: 18 } },total_profit: 27,total_revenue: 9,total_loss: 18 }
}
end
let(:expected) do
{
1 => { users: { 2 => { id: 2,loss: -30 },1 => { id: 1,loss: 9 } },total_loss: 18 }
}
end
it 'sort' do
def mysort(data)
data.each do |_,partner|
partner[:users].sort_by { |_k,user| user[:loss] }.to_h
partner
end
data.sort_by { |_,partner| partner[:total_loss] }.to_h
end
expect(mysort(actual)).to eql expected
# expect(Digest::MD5.hexdigest(Marshal::dump(mysort(actual)))).to eql Digest::MD5.hexdigest(Marshal::dump(expected))
end
end
测试通过了。但是,如果我取消对md5检查的注释,它将引发一个哈希不同的错误:
expected: "155d27d209f286fb1fc9ebeb0dcd6d3d"
got: "255df98d4fc8166d0d8ffc7227ffd351"
因此,eql实际上不能正确比较散列,并且mysort函数中存在错误:
def mysort(data)
data.each do |_,partner|
partner[:users] = partner[:users].sort_by { |_k,user| user[:loss] }.to_h
partner
end
data.sort_by { |_,partner| partner[:total_loss] }.to_h
end
现在排序还可以,但是仅比较md5校验和有助于了解哈希是否相等:(
如何在没有这种技巧的情况下比较哈希?