57

我正在构建一个系统,该系统需要能够找到字节块是否已更新。我认为我应该计算它的校验和,然后存储它并稍后计算相同的校验和,以查看 blob 是否已更新,而不是存储整个 blob(它们最多可达 5MB)。

目标是最小化以下内容(按此顺序):

  • 校验和的大小
  • 计算时间
  • 冲突的可能性(即使内容已被修改,也会发生 2 个相同的校验和)。

我们的系统可以接受不超过 1/1,000,000 的碰撞。关心的不是安全性,而是简单的更新/错误检测,所以很少发生冲突是可以的。(这就是为什么我把它放在最后的原因)。

此外,我们不能自己修改文本块。

当然md5crc或者sha1想到,如果我想要一个快速的解决方案,我会去的。但是,不仅仅是一个快速的解决方案,我还在寻找可以比较不同方法以及利弊的内容。

4

2 回答 2

30

我建议你看看这个 SO 页面,CRC vs MD5/SHA1。
速度和碰撞在另一个线程中讨论。
和往常一样,维基百科是你的朋友。

如果让我选择,有一个重要的问题需要回答:你是否希望在任何情况下都没有碰撞——或者,至少,概率如此之低,以至于接近月球与地球相撞的可能性?在接下来的 5 分钟内?

如果是,请选择 SHA 系列。
在你的情况下,我会改变更新检查的方式。
例如,一个递增的数字可以与 blob 相关联,并被发送而不是hash,如果另一侧的数字不同,则需要更新请求。在这种情况下,碰撞概率从 ~10^-18 到 ~0(基本上是 0 + bug 概率)......

编辑以下评论

找到了这个算法,Adler-32,它适用于 32 位 CRC 的长消息 (MB),即大约 ~1/10^9(MD5 的长度为 128 位)。
计算速度很快。
阿德勒-32。底部有一些示例(链接)。

于 2010-11-20T14:25:44.947 回答
2

Blake2 是您可以使用的最快的哈希函数,主要采用:

BLAKE2 不仅比其他好的散列函数更快,它甚至比 MD5 或 SHA-1 Source更快

SHA-3 竞赛的获胜者是 Keccak 算法,但还没有流行的实现,默认情况下在 GNU/Linux 发行版中不采用。相反,作为 SHA-3 竞赛候选者的 Blake2 比 Keccak 更快,并且是GNU coreutils的一部分。因此,在您的 GNU/Linux 发行版上,您可以b2sum使用 Blake2 哈希算法。

于 2017-05-21T18:05:44.087 回答