我正在构建一个系统,该系统需要能够查找字节 block 是否已更新。 我认为我应该计算它的校验和,存储它并稍后计算相同的校验和,以查看该 blob 是否已更新,而不是存储整个 blob(它们最多可达 5MB)。
目标是尽量减少以下内容(按顺序):
- 校验和的大小
- 计算时间
- 冲突的可能性(即使内容已被修改,也会发生 2 个相同的校验和)。
我们的系统碰撞次数不超过 1/1,000,000 次是可以接受的。关心的不是安全性,而只是更新/错误检测,因此很少发生冲突是可以的。 (这就是为什么我把它放在要最小化的事情的最后)。
此外,我们无法自己修改文本 block 。
当然,我会想到md5
、crc
或sha1
,如果我想要一个快速的解决方案,我会这样做。然而,我不仅仅是在寻找快速解决方案,而是在寻找不同方法及其优缺点的比较。
最佳答案
我建议你看看this SO page , CRC 与 MD5/SHA1。
速度和碰撞在 this other thread 中讨论。 .
一如既往Wikipedia是你的 friend 。
如果我必须选择,有一个重要的问题需要回答:你是否希望在任何情况下都不会发生碰撞 - 或者至少希望概率如此之低以至于接近月球发生碰撞的概率 future 5 分钟内与地球相撞?
如果是,请选择 SHA 系列。
对于您的情况,我会更改更新检查的完成方式。
例如,增量编号可以与 blob 关联,并代替哈希发送,如果另一个编号不同,则需要更新请求边。这种情况下的碰撞概率从 ~10^-18 到 ~0(基本上是 0 + bug 概率)...
编辑以下评论
找到了这个算法,Adler-32,它适用于具有 32 位 CRC 的长消息 (MB),即大约 ~1/10^9(MD5 的长度为 128 位)。
计算速度很快。
Adler-32 。底部有一些示例(链接)。
关于md5 - 我应该使用什么校验和算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233113/