我正在构建一个系统,需要能够找到 blob的字节是否已更新。 而不是存储整个blob(它们可以高达5MB),我认为我应该计算它的校验和,存储它并稍后计算相同的校验和,以查看博客是否已更新。
目标是最小化以下(按此顺序):
我们的系统碰撞不超过1 / 1,000,000是可以接受的。问题不在于安全性,而在于更新/错误检测,因此罕见的冲突是可以的。 (这就是为什么我把它放在最小化的东西中)。
另外,我们不能自己修改文本的blob。
当然,我会想到md5
,crc
或sha1
,如果我想要快速解决方案,我会选择它。然而,不仅仅是一个快速的解决方案,我正在寻找可以比较不同方法以及利弊的内容。
答案 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哈希算法。