Rails active_storage: 检查附件是否与给定文件相同
Rails active_storage: Check if an attachment is the same as a given file
鉴于以下情况:
- 通过文件传输新收到的 PDF 类型的文档
source
- 文档
target
使用 active_storage
和版本化 保存为附件 blob
我想检查 target
的任何现有版本是否二进制等于 source
。如果没有 active_storage
,我会对进入数据库的任何 blob 进行 SHA256 求和。为了进行比较,我将 source
的新 SHA256 总和与为 target
.
的任何版本存储的每个校验和进行了比较
但是 active_storage
附件和 blob 的方法 .checksum
似乎既不是 MD5 也不是 SHA265 和。例如,我得到 Cr4IxYNF7v7cJao1EiiBEw==
一些文件。
一个解决方案是使用类似 Digest::SHA256.hexdigest(Person.find(46).photo.download)
的东西,但是性能会很糟糕。
如何有效地搜索我的 active_storage
“数据库”?
根据 ActiveStorage 来源,校验和实际上是 MD5。但是已经base64编码了
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 编码,以便在数据库中进行比较。
鉴于以下情况:
- 通过文件传输新收到的 PDF 类型的文档
source
- 文档
target
使用active_storage
和版本化 保存为附件 blob
我想检查 target
的任何现有版本是否二进制等于 source
。如果没有 active_storage
,我会对进入数据库的任何 blob 进行 SHA256 求和。为了进行比较,我将 source
的新 SHA256 总和与为 target
.
但是 active_storage
附件和 blob 的方法 .checksum
似乎既不是 MD5 也不是 SHA265 和。例如,我得到 Cr4IxYNF7v7cJao1EiiBEw==
一些文件。
一个解决方案是使用类似 Digest::SHA256.hexdigest(Person.find(46).photo.download)
的东西,但是性能会很糟糕。
如何有效地搜索我的 active_storage
“数据库”?
根据 ActiveStorage 来源,校验和实际上是 MD5。但是已经base64编码了
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 编码,以便在数据库中进行比较。