我应该使用什么校验和algorithm?
我正在build立一个系统,需要能够find是否更新字节blob 。 而不是存储整个blob(他们可以高达5MBs),我想我应该计算它的校验和,存储这个并稍后计算相同的校验和,看看博客是否已经更新。
目标是最小化以下(按此顺序):
- 校验和的大小
- 计算时间
- 碰撞的可能性(即使内容已被修改,也会发生2次相同的校验和)。
我们的系统碰撞不超过1 / 1,000,000是可以接受的。 关心的不是安全问题,而只是更新/错误检测,所以罕见的碰撞是可以的。 (这就是为什么我把它放在最小化的东西)。
另外,我们不能自己修改文本的斑点。
当然, md5
, crc
或sha1
会让人想起,如果我想要一个快速的解决scheme,我会去做的。 然而,不仅仅是一个快速的解决scheme,我正在寻找什么可以比较不同的方法,以及利弊 。
我build议你看看这个SO页 ,CRC与MD5 / SHA1。
速度和碰撞在另一个线程中讨论。
和往常一样, 维基百科是你的朋友。
如果我不得不select,那么有一个重要的问题需要回答:你是否希望在任何情况下都不会发生碰撞 – 或者至less可能性太低,接近月球与地球碰撞的可能性在接下来的5分钟内?
如果是,请selectSHA系列。
在你的情况下,我会改变更新检查的方式。
例如,一个递增的数字可以与blob相关联,并且被发送而不是散列 ,如果数字在另一侧不同,则需要更新的请求 。 在这种情况下的碰撞概率从〜10 ^ -18到〜0(基本上0 + 错误概率 )…
编辑下面的评论
发现这个algorithm,Alder-32,这是适用于32位CRC的长消息(MB),即约1/10 ^ 9(MD5是128位长)。
计算速度快。
阿德勒-32 。 底部有一些来样(链接)。
Blake2是您可以使用的最快的哈希函数,主要采用:
BLAKE2不仅比其他好的哈希函数更快,而且比MD5或SHA-1 源更快
SHA-3大赛的获胜者是Keccakalgorithm,但目前还没有一个stream行的实现在GNU / Linux发行版中默认不采用。 相反,Blake2是一个SHA-3竞赛候选人,比Keccak更快,是GNU coreutils的一部分。 因此,在GNU / Linux发行版上,您可以使用b2sum
来使用Blake2哈希algorithm。