【发布时间】:2016-08-10 06:57:59
【问题描述】:
我想从一个 ruby 哈希计算一个唯一的 sha1 哈希。我想过
- (深度)将哈希转换为数组
- 对数组进行排序
- 空字符串加入数组
- 计算sha1
考虑以下哈希:
hash = {
foo: "test",
bar: [1,2,3]
hello: {
world: "world",
arrays: [
{foo: "bar"}
]
}
}
我怎样才能将这种嵌套散列放入一个数组中
[:foo, "test", :bar, 1, 2, 3, :hello, :world, "earth", :arrays, :my, "example"]
然后我会对数组进行排序,将其与array.join("") 连接起来,然后像这样计算 sha1 哈希:
require 'digest/sha1'
Digest::SHA1.hexdigest hash_string
- 如何像上面描述的那样展平哈希?
- 是否已经有这方面的宝石?
- 有没有更快/更简单的方法来解决这个问题?我有大量的对象要转换(~700k),所以性能很重要。
编辑
我通过下面的答案发现的另一个问题是这两个哈希:
a = {a: "a", b: "b"}
b = {a: "b", b: "a"}
在展平散列并对其进行排序时,这两个散列会产生相同的输出,即使在 a == b => false 时也是如此。
编辑 2
整个事情的用例是产品数据比较。产品数据存储在哈希中,然后序列化并发送到创建/更新产品数据的服务。
我想检查产品数据中是否有任何更改,因此我从产品内容生成哈希并将其存储在数据库中。下次加载相同的产品时,我会再次计算哈希值,将其与数据库中的哈希值进行比较,然后确定产品是否需要更新。
【问题讨论】:
-
这是一个 X/Y 问题。虽然 MRI Ruby 哈希是有序的,但您不能保证哈希排序。您必须比较特定的键/值对,或者依赖序列化顺序(可能在排序之后)。您可能需要重新考虑数据的表示。
-
请在
bar: [1,2,3]后加逗号。我不明白为什么有人给出答案没有提到这个遗漏。 -
您的哈希与您希望从中生成的数组不匹配。同样,为什么那些给出答案的人没有提到这一点? “马虎”是我用来描述这个问题的词。