首页
社区
课程
招聘
[求助]如何理解adler32_combine() in adler32.c of zlib-1.2.3
发表于: 2006-9-20 14:04 4775

[求助]如何理解adler32_combine() in adler32.c of zlib-1.2.3

2006-9-20 14:04
4775
adler32_combine()函数是将两个adler32值组合的函数。   
         
          :::数学原理:::
         
A1 = P[1] + P[2] + P[3] + ... + P[m]
B1 = mP[1] + (m-1)P[2] + (m-2)P[3] + ... + P[m]

A2 = Q[1] + Q[2] + Q[3] + ... + Q[n]
B2 = nQ[1] + (n-1)Q[2] + (n-2)Q[3] + ... + Q[n]

A = P[1] + P[2] + ... + P[m] + Q[1] + Q[2] + Q[3] + ... + Q[n]        = A1 + A2

B = (m+n)P[1] + (m-1+n)P[2] + (m-2+n)P[3] + ... + (1+n)P[m] + nQ[1] + (n-1)Q[2] + (n-2)Q[3] + ... + Q[n]               
  = B1 + B2 + nA1                     

Adler32
A = (A1+A2) mod Modulo                     
B = (B1+B2+nA1) mod Modulo

但Adler32的发明者Mark                          Adler为什么在实现ader32_combine有如此古怪的代码
---------------------------------------------
    rem = (unsigned)(len2 % BASE);
    sum1 = adler1 & 0xffff;
    sum2 = rem * sum1;
    MOD(sum2);
    sum1 += (adler2 & 0xffff) + BASE - 1;
    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
---------------------------------------------
???
I.
rem
II.
rem*sum1
III.
BASE-1
IV.
BASE-rem

希望各位大牛指点一二!!!
在此谢过!!!
我不是指语法或语义层面,指算法的实现。

uLong ZEXPORT adler32_combine(adler1, adler2, len2)
    uLong adler1;
    uLong adler2;
    z_off_t len2;
{
    unsigned long sum1;
    unsigned long sum2;
    unsigned rem;

    /* the derivation of this formula is left as an exercise for the reader */
    rem = (unsigned)(len2 % BASE);
    sum1 = adler1 & 0xffff;
    sum2 = rem * sum1;
    MOD(sum2);
    sum1 += (adler2 & 0xffff) + BASE - 1;
    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
    if (sum1 > BASE) sum1 -= BASE;
    if (sum1 > BASE) sum1 -= BASE;
    if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
    if (sum2 > BASE) sum2 -= BASE;
    return sum1 | (sum2 << 16);
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
2
已解,看我贴子。
2006-9-20 19:03
0
游客
登录 | 注册 方可回帖
返回
//