【问题标题】:md5/sha1 hashing large filesmd5/sha1 散列大文件
【发布时间】:2015-05-03 05:36:39
【问题描述】:

我有超过 1/2 百万个文件要散列到多个文件夹 md5/crc 散列耗时太长,某些文件的大小为 1GB ~ 11Gb 我正在考虑使用 head 对文件的一部分进行哈希处理

所以当涉及到散列查找和散列所有内容时,下面的方法是有效的。

find . -type f -exec sha1sum {} \;

我只是确定如何更进一步,只需对文件的第一个 256kB 进行哈希处理,例如

find . -type f -exec head -c 256kB | sha1sum 

不确定 head 在这种情况下是否可以使用 dd 会更好吗? 上面的命令不起作用,所以寻找关于如何做到这一点的想法

我希望输出与在本机 md5sum 中看到的相同,例如以下格式(转到文本文件)

<Hash>  <file name>

我不确定上述是否可以通过单行实现,或者是否需要使用 for/do 循环.....在 RHEL6 上使用 bash 性能是关键

【问题讨论】:

  • 它的管道让你的进程中断。将您的 head .. | sha1sum 放入脚本中。还要在头部添加一个“$@”作为参数。祝你好运。
  • 这不是部分废除了哈希的使用吗?也就是说,如果有几个字节发生变化——不管它们的位置如何——哈希值会发生变化?
  • 考虑使用GNU Parallel 来完成工作,使用您支付的所有这些可爱的核心闲置。很简单,只需发送您可能遇到的命令列表parallel

标签: linux bash hash


【解决方案1】:

目前尚不清楚您的限制在哪里。您的磁盘速度慢还是 CPU 速度慢?

如果您的磁盘不是限制,您可能会受到使用单核的限制。 GNU Parallel 可以提供帮助:

find . -type f | parallel -X sha256sum

如果限制是磁盘 I/O,那么您对 ​​head 的想法非常合理:

sha() {
   tail -c 1M "$1" | sha256sum | perl -pe 'BEGIN{$a=shift} s/-/$a/' "$1";
}
export -f sha
find . -type f -print0 | parallel -0 -j10 --tag sha

-j10 的最佳值取决于您的磁盘系统,因此请尝试调整它直到找到最佳值(可能低至 -j1)。

【讨论】:

  • 是的磁盘 i/o 在我的情况下是一个问题,大多数文件都存档在慢速备份存储上。从中读取,尤其是在需要完整哈希时非常慢。例如,一个 2.5TB 的文件夹需要 6.5 天才能对每个文件(>600K 文件)进行全哈希处理,因此需要一种解决方案,让“一些”确信文件在复制后是有序的
  • 我看到后端存储的寻道时间极慢,但读取速度却相当快(想想磁带站机器人和类似的东西)。取决于它是否正在寻找它可能仍然更快并行化。唯一确定的方法就是尝试。
  • 我现在才明白,您需要对复制有信心。为此,我强烈建议使用tail 而不是head:这样如果只复制了一个大文件的开头,您就会发现。
  • 这里的“perl -pe”到底是做什么的,它似乎只适用于这个地方
  • 它将 sha256sum 的输出中的 - 替换为 $1(即文件名)
猜你喜欢
  • 2011-06-08
  • 2013-04-24
  • 2023-03-24
  • 2015-08-05
  • 2011-07-03
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多