您可能有兴趣阅读ssdeep,这是一种“上下文触发的分段散列”(CTPH),用作与内容无关的模糊散列形式。Ssdeep 构建文件片段的哈希值,以便确定相似性;假设一个字符在两个相同的文件之间发生变化。更改的文件部分的校验和会有所不同,但所有其他部分的校验和不会,因此文件被认为是高度相似的。
您实际上是在尝试这样做,但不打算使用它来测量文件相似性。
我的印象是,只要您保留整个哈希(不要截断它们)并且您哈希的段足够大以使冲突很少发生(可能是 512 字节?),那么您将拥有足够的数据完整性水平。从理论上讲,由于哈希长度更长,因此您可能具有更高的完整性,但是在实现中必须特别注意很多方面,我根本不推荐这样做。
也就是说,您指定了三个sha256 哈希值,其中一个用于整个文件。只要您匹配所有三个,这应该是最弱的,与单独的 sha256 一样好。它可能更强大,但是当涉及到理论上的 SHA-2 漏洞时,您(可能)会像单个 sha256 一样容易受到攻击,因此您不妨选择另一种算法,例如SHA-3甚至(因为您仍然拥有完整文件的 sha256)更快的东西,比如 MD5。您还可以考虑存储字节大小。
除非您担心遥远的未来,否则 256 位 SHA-2 应该足以应付任何事情。如果是这种情况,你不能认为任何事情都是理所当然的,但我会选择 SHA2-512和SHA3-512以及确切的文件大小。
如果您只是想要更快的速度并且不担心受到攻击(即您只是担心故障硬件和/或糟糕网络的数据完整性),您可以从文件大小开始,然后同时计算 MD5 和 SHA1(两个单独的进程,一个文件读取)。除非您想使用 ssdeep (默认情况下似乎使用 MD5 作为其片段),否则我仍然不会混淆文件。
也许速度和完整性的一个有吸引力的平衡可能是检查文件大小,然后是前 5MB 的 MD5(或整个文件,如果低于 5MB),然后是真正的完整性检查,例如 sha256 或 sha3-512。它应该*更难创建碰撞并且更快地检测故障(在第一次故障时停止),而仅比最后一次检查慢得可以忽略不计(我花了 0.003 秒来计算随机 5MB 测试文件的 MD5 哈希)。 (* 我既不是密码分析专家,也不是密码校验和专家:这不是权威的。)
我想说的是,如果不怀疑攻击,那么文件大小和 MD5 都可以(您可能只使用 MD5 就可以了,尽管文件大小可以让您更快地失败并提供更好的数据的完整性)。