代码之家  ›  专栏  ›  技术社区  ›  Julien Genestoux

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

  •  52
  • Julien Genestoux  · 技术社区  · 14 年前

    我正在建立一个系统,它需要能够发现 字节块已更新 . 与其存储整个blob(它们可以高达5mb),不如计算它的校验和,存储它,稍后再计算相同的校验和,以查看博客是否已更新。

    目标是尽量减少以下情况(按此顺序):

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

    我们的系统碰撞不超过1/1000000是可以接受的。关注的不是安全性,而是简单的更新/错误检测,所以很少的冲突是可以的。(这就是为什么我把它放在最重要的事情上。

    而且,我们不能自己修改文本块。

    当然, md5 , crc sha1 想想看,如果我想要一个快速的解决方案,我会去的。不过,除了一个快速的解决方案,我还在寻找 不同方法的比较及其利弊

    2 回复  |  直到 14 年前
        1
  •  27
  •   Community    7 年前

    我建议你看看 this SO page ,CRC与MD5/SHA1的比较。
    速度和碰撞在 this other thread .
    像往常一样 Wikipedia 是你的朋友。

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

    如果是,选择沙家。
    如果是你,我会改变 更新检查 正在完成。
    例如,增量数字可以与blob关联,并被发送而不是 搞砸 ,和 请求更新 如果另一侧的号码不同,则需要。在这种情况下,碰撞概率从~10^-18到~0(基本上是0+ 错误概率 )...

    编辑 以下评论

    找到了这个算法,Alder-32,它适用于CRC为32位的长消息(MB),即大约1/10^9(MD5是128位长)。
    计算起来很快。
    Adler-32 . 底部有一些来样(链接)。

        2
  •  1
  •   noraj    7 年前

    Blake2是可以使用的最快的散列函数,主要采用:

    BLAKE2不仅比其他好的散列函数快,而且 比MD5或SHA-1还要快 Source

    SHA-3竞赛的获胜者是Keccak算法,但它还没有一个流行的实现,在GNU/Linux发行版中默认不采用。相反,曾是SHA-3竞赛候选人的Blake2比Keccak更快,而且是 GNU coreutils . 所以在GNU/Linux发行版上可以使用 b2sum 使用Blake2哈希算法。