我读到有关 MD5 冲突的信息,并且 MD5 不再可靠,但是,我很好奇当我们检查文件的完整性时这是否适用。我注意到 FLAC/metaflac(免费无损音频编解码器)等工具仍然依赖 MD5 来检查音乐文件的数据完整性。
答案1
是的,即使 CRC32 也是可行的,因为当您听说 MD5/SHA1 的冲突时,它是关于使用疯狂的计算能力来专门制作数据来创建具有冲突的文件。
这不适用于您的存储/RAM/IO 可能发生的单位错误。
但需要注意一件事:对于较新的 CPU,SHA1/SHA256 可以是快得多与 MD5 相比,因为前者是硬件加速的,而 MD5 是计算的。
只需运行time sha256sum/md5sum large_enough_file
即可查看。
对于此处的缓存 4.5GB 文件:
$ time md5sum *iso
b5a7be560dbd73619945129e52be1b5f win10.iso
real 0m5.037s
user 0m4.805s
sys 0m0.229s
$ time sha256sum *iso
c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d win10.iso
real 0m2.283s
user 0m2.031s
sys 0m0.250s
这是我很久以前编写的一个很好的脚本,用于创建一个包含所有音频文件哈希和的文件。
#! /bin/bash
cd /audio || exit 1
echo -n "Running ... "
find . \( -iname "*.mp3" -o \
-iname "*.m4a" -o \
-iname "*.ogg" -o \
-iname "*.flac" \
\) -print0 | sed 's/\.\///' | sed 's/\x0\.\//\x0/g' | sort -z | xargs -0 -n1 ionice -c 3 md5sum | tee /tmp/ALL-`date +%F`.md5 | \
awk '
BEGIN{ORS=""}
{
out=substr($0, 35);
print out;
fflush();
for (i=0;i<length(out);i++) print "\b \b";
}
END{print FNR" all done\n";}
'
echo " finished"
对于/audio
目录,它计算所有指定文件类型的 md5 哈希值并生成一个/tmp
.