我应该使用什么校验和算法?

时间:2010-11-20 14:09:52

标签: md5 sha1 checksum crc

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

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

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

我们的系统碰撞不超过1 / 1,000,000是可以接受的。问题不在于安全性,而在于更新/错误检测,因此罕见的冲突是可以的。 (这就是为什么我把它放在最小化的东西中)。

另外,我们不能自己修改文本的blob。

当然,我会想到md5crcsha1,如果我想要快速解决方案,我会选择它。然而,不仅仅是一个快速的解决方案,我正在寻找可以比较不同方法以及利弊的内容。

2 个答案:

答案 0 :(得分:25)

我建议您查看this SO page,CRC与MD5 / SHA1 this other thread中讨论了速度和碰撞 和往常Wikipedia是你的朋友。

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

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

编辑以下评论

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

答案 1 :(得分:0)

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

  

BLAKE2不仅比其他好的哈希函数更快,它是   甚至比MD5或SHA-1还要快   Source

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