【发布时间】:2011-05-13 02:21:24
【问题描述】:
我正在构建一个系统,该系统需要能够查找字节块是否已更新。 我认为我应该计算它的校验和,然后存储它并稍后计算相同的校验和,以查看 blob 是否已更新,而不是存储整个 blob(它们最多可达 5MB)。
目标是最小化以下(按此顺序):
- 校验和的大小
- 计算时间
- 冲突的可能性(即使内容已被修改,也会发生 2 个相同的校验和)。
我们的系统可以接受不超过 1/1,000,000 的冲突。关心的不是安全性,而是简单的更新/错误检测,所以很少发生冲突是可以的。 (这就是为什么我把它放在最后的原因)。
此外,我们不能自己修改文本块。
当然,我会想到 md5、crc 或 sha1,如果我想要一个快速的解决方案,我会去的。但是,除了快速解决方案之外,我还在寻找不同方法的比较以及优缺点。
【问题讨论】:
-
您有什么顾虑,在这里?您是在检查您的数据 blob 是否自较早前发生了变化,还是在尝试检测恶意更改?
-
只是想看看它们是否有任何更新。
-
如果您不担心恶意更改的可能性,而只想跟踪更改,并且(如您在其他地方所说)您可以忍受百万分之一的意外碰撞概率,那么使用 CRC - 它比 MD5 或 SHA 更快,并且冲突的可能性在您的规范内很好。
-
我会推荐 CRC-64。它比加密哈希要快得多,并且应该满足您对冲突概率的要求。