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

Jul*_*oux 52 checksum md5 sha1 crc

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

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

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

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

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

当然,md5,crcsha1浮现在脑海中,如果我想要一个快速的解决方案,我去了.然而,不仅仅是一个快速的解决方案,我正在寻找可以比较不同方法以及利弊的东西.

Rin*_*g Ø 27

我建议你看一下这个SO页面,CRC vs MD5/SHA1.
另一个线程中讨论了速度和冲突.维基百科
一如既往是你的朋友.

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

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

编辑以下评论

发现这个算法,阿尔德-32,这是良好的长消息(MB)与32个比特的CRC,即约〜1/10 ^ 9(MD5是128位长).
计算速度快.
阿德勒-32.有一个在底部的一些样品过来(链接).