我正在编写一个程序,它将扫描一个目录,获取文件中行的校验和,并将其与某个数据库进行比较,返回匹配的条目。
我的数据库是一个包含文件名及其行校验和的 json 文件,它看起来像这样:
"HASHES": {
"file_name": {
"1": "checksum",
"2": "checksum"
},
"file_name": {
"1": "checksum",
"2": "checksum
},
etc..
}
然后我扫描一个目录并构建一个类似的散列(即文件名、行号、校验和的散列)。此代码有效。
我遇到的问题是从结果中重建一个类似的散列
这是我的代码:
def compare(dir_hash, database_hash)
temp_hash = database_hash.dup
# retrieve the checksums from the dir_hash.
dir_values = dir_hash["HASHES"].sort_by(&:first).map { |x| x.last.values }
# retrieve the checksums from database_hash
db_values = database_hash["HASHES"].sort_by(&:first).map { |x| x.last.values }
# perform a set intersection to get the common values
unique_values = dir_values.zip(db_values).map { |x| x.reduce(:&) }
# code to reconstruct hash, based on new values
new_hash = temp_hash["HASHES"]
end
我似乎无法弄清楚如何使用修改后的值重建散列。
感谢帮助。
注意
sort_by(&:first)
的目的是确保当我们执行集合交集时,我们是在相同的值上执行它,换句话说,我取集合交集目录中的文件 x
和数据库中的相同文件 x
(由于 Ruby 不保留键的顺序)
由于sort_by
将返回一个数组,第一个元素将是文件名,第二个元素将是行号、校验和的散列
最佳答案
另一种方法:
intersect_ary = database_hash["HASHES"].keys & dir_hash["HASHES"].keys
new_hash = dir_hash
intersect_ary.each do |file|
new_hash["HASHES"][file].select! {|key| new_hash["HASHES"][file][key] == database_hash["HASHES"][file][key]}
end
(假设你必须创建一个新的散列而不是仅仅改变 dir_hash
)
关于Ruby - 从修改后的值重构哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595440/