1

鉴于以下情况:

  • source通过文件传输新收到的 PDF 类型的文档
  • 使用和版本化target保存为附件 blob 的文档active_storage

我想检查任何现有版本target是否二进制等于source. 如果没有active_storage,我会对进入数据库的任何 blob 进行 SHA256 总和。为了进行比较,我会将新的 SHA256 总和与source为任何版本存储的每个校验和进行比较target

然而.checksumactive_storage附件和 blob 的方法似乎既不是 MD5 也不是 SHA265 和。例如,我得到Cr4IxYNF7v7cJao1EiiBEw==一些文件。

一个解决方案是使用类似的东西,Digest::SHA256.hexdigest(Person.find(46).photo.download)但是性能会很糟糕。

如何有效地搜索我的active_storage“数据库”?

4

1 回答 1

1

根据 ActiveStorage 来源,校验和实际上是 MD5。但它已经过base64编码。

来源:https ://github.com/rails/rails/blob/8da6ba9cae21beae1ee3c379db7b7113d2731c9b/activestorage/app/models/active_storage/blob.rb#L313

def compute_checksum_in_chunks(io)
  Digest::MD5.new.tap do |checksum|
    while chunk = io.read(5.megabytes)
      checksum << chunk
    end

    io.rewind
  end.base64digest
end

所以希望你应该能够对你自己的 MD5 哈希值进行 base64 编码,以便在数据库中进行比较。

于 2021-03-18T19:13:51.200 回答