http://blog.csdn.net/flyfish1986/article/details/2606173
2008
rsync 弱校验采用的是adler32算法
下面是linux下的校验源码
uint32 get_checksum1(char *buf1, int32 len)
{
int32 i;
uint32 s1, s2;
schar *buf = (schar *)buf1;
s1 = s2 = 0;
for (i = 0; i < (len-4); i+=4) {
s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] +
10*CHAR_OFFSET;
s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET);
}
for (; i < len; i++) {
s1 += (buf[i]+CHAR_OFFSET); s2 += s1;
}
return (s1 & 0xffff) + (s2 << 16);
}
如果在windows下运行需要更改一下
unsigned long get_checksum1(unsigned char *buf1, int len)
{
int i;
unsigned long s1, s2;
char *buf = (char *)buf1;
s1 = s2 = 0;
for (i = 0; i < (len-4); i+=4) {
s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] +
10*CHAR_OFFSET;
s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET);
}
for (; i < len; i++) {
s1 += (buf[i]+CHAR_OFFSET); s2 += s1;
}
return (s1 & 0xffff) + (s2 << 16);
}
也可以自己编写一个
unsigned long adler32(unsigned char *buf, int len)
{
unsigned long s1 = 0;
unsigned long s2 = 0;
int i;
for (i = 0; i < len; i++)
{
s1 = (s1 + buf[i]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}
未完 只是个开始,我的另一篇文章adler32算法的实现和这个不一样,只是在s1的初始值是1
联系客服