在研究ZooKeeper的时候,看到用到Adler-32算法来进行校验,由于之前从未用过,甚至没有听说过,所以就查了一下这个算法.
我看的是Wikipedia上的解释,所以这篇文章可以算是对Wikipedia上相关条目的总结.
为什么需要Adler-32算法
关于校验码算法,我们最熟悉的算法应该是CRC校验算法,那么有了CRC校验算法之后,为什么还要提出这样一个算法呢?
这个算法比CRC算法更加快速,但是安全性不如CRC.换句话说,就是在安全性和速度之间做了一个权衡.
算法描述
假设我们要得到D的Adler-32校验码,n是D的长度(以字节为单位).那我们可以用以下公式来取得:
其中要mod 65521.
好,公式就是这样.
我们来看一个具体的例子,这个例子同样是Wikipedia中的:
总结
算法很简单,对吧?
但是这个算法是正确的吗?我不知道,我并没有看到关于这个算法的论文,并没有去验证它的正确性.只能假设它是正确的,毕竟在JDK中已经实现了.