weak checksum question

Jeff Abrahamson jeff at purple.com
Tue Nov 12 01:11:02 EST 2002


The weak checksum in checksum.c (see snippet below) differs
substantially from the one discussed in Andrew Tridgell's doctoral
thesis on rsync and elsewhere that I've been able to find. I didn't
find discussion of the change in the mailing list archives. Well, so
I'm curious what the benefit of the change is.

(I'm using a rolling checksum in another app, thus the reason for this
nitty inspection.)

Can anyone provide a pointer to help me understand why this changed?

Thanks much.


In checksum.c:

    uint32 get_checksum1(char *buf1,int len)
    {
        int 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);
    }


What I understood from documentation:

    /* Rolling checksum from Tridgell's PhD thesis. */
    int get_weak_checksum(signed char *buf, int len)
    {
            int s;
            int s1, s2;
            int len4;

            s1 = s2 = 0;
            len4 = len / 4;
            for(i = 0; i < len - 4; i += 4) {
                    s = (buf[i] << 24) + (buf[i+1] << 16)
                            + (buf[i+2] << 8) + (buf[i+3]);
                    s1 += s;
                    s2 += (len4 - 4 * i) * s;
            }
            return (s2 << 16) + (s1 & 0xffff);
    }



-- 
 Jeff

 Jeff Abrahamson  <http://www.purple.com/jeff/>




More information about the rsync mailing list