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

标签 md5 sha1 checksum crc

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

目标是尽量减少以下内容(按顺序):

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

我们的系统碰撞次数不超过 1/1,000,000 次是可以接受的。关心的不是安全性,而只是更新/错误检测,因此很少发生冲突是可以的。 (这就是为什么我把它放在要最小化的事情的最后)。

此外,我们无法自己修改文本 block 。

当然,我会想到md5crcsha1,如果我想要一个快速的解决方案,我会这样做。然而,我不仅仅是在寻找快速解决方案,而是在寻找不同方法及其优缺点的比较

最佳答案

我建议你看看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/

相关文章:

ssl - 如何在命令行上检查我的 SSL 证书是 SHA1 还是 SHA2

c - 如何使用 C 将 SHA1 输出存储到文件

c - 如何计算 CRC32 校验和?

java - 通过 JDBC 更新的散列密码已损坏。 (更多的是编码问题而不是散列)

sql-server - 计算 SQL Server 中表的哈希值或校验和

checksum - BitTorrent 是否验证文件的完整性?

md5 - 散列函数保证唯一?

python - md5多线程暴力破解

linux - 比较 n 个文件(二进制)

php - 显示密码不是 md5 格式的行