See simd-checksum-*.cpp. */ a simple 32 bit checksum that can be updated from either end (inspired by Mark Adler's Adler-32 checksum) */
| 283 | (inspired by Mark Adler's Adler-32 checksum) |
| 284 | */ |
| 285 | uint32 get_checksum1(char *buf1, int32 len) |
| 286 | { |
| 287 | int32 i; |
| 288 | uint32 s1, s2; |
| 289 | schar *buf = (schar *)buf1; |
| 290 | |
| 291 | s1 = s2 = 0; |
| 292 | for (i = 0; i < (len-4); i+=4) { |
| 293 | s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3] + 10*CHAR_OFFSET; |
| 294 | s1 += (buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3] + 4*CHAR_OFFSET); |
| 295 | } |
| 296 | for (; i < len; i++) { |
| 297 | s1 += (buf[i]+CHAR_OFFSET); s2 += s1; |
| 298 | } |
| 299 | return (s1 & 0xffff) + (s2 << 16); |
| 300 | } |
| 301 | #endif |
| 302 | |
| 303 | /* The "sum" buffer must be at least MAX_DIGEST_LEN bytes! */ |
no outgoing calls
no test coverage detected