CRC32 vs. Adler32
You need to choose a checksum and dunno which, well the 2 most popular ones are the CRC and Adler32 checksum
Speed / innermost loop
CRC32:
while(buffer<end -3){ crc ^= le2me_32(*(uint32_t*)buffer); buffer+=4; crc = tab[3][ crc &0xFF] ^tab[2][(crc>>8 )&0xFF] ^tab[1][(crc>>16)&0xFF] ^tab[0][(crc>>24) ]; }
Adler32:
while(buffer<end -3){ s1 += *buffer++; s2+=s1; s1 += *buffer++; s2+=s1; s1 += *buffer++; s2+=s1; s1 += *buffer++; s2+=s1; }
as we can see adler needs 12 adds and 4 1byte reads and crc needs 1 4byte read, 4 xor, 4 table lookups, 1 add, 3 and, 3 shift, without benchmarking i would say adler should be faster
Burst error detecting capabilities
CRC-32 can detect every burst error of 32 or less bits
Adler-32 will fail with at least one 17bit burst error (0 00000010 00000000 vs. 1 00000000 00000001)
Bit error detecting capabilities
CRC-32 differs depening upon generator polynom see misusing-crcs-for-error-correction
Adler-32 can detect every 2bit error within 65521 byte or so but will fail with some 3 bit errors
Random error detecting capabilities
CRC-32 will produce a evenly distributed checksum for messages >4byte
Adler-32 will produce a quite unevenly distributed checksum for small mesages so that the effective number of bits in the checksum is significantly reduced for short messags
adler32 len= 1, collisions=488296949(0.390637%), effective bits=7.999957 len= 2, collisions= 1903788(0.001523%), effective bits=16.002699 len= 4, collisions= 372789(0.000298%), effective bits=18.355140 len= 8, collisions= 94799(0.000076%), effective bits=20.330556 len= 16, collisions= 23902(0.000019%), effective bits=22.318296 len= 32, collisions= 6068(0.000005%), effective bits=24.296135 len= 64, collisions= 1573(0.000001%), effective bits=26.243837 len= 128, collisions= 669(0.000001%), effective bits=27.477278 len= 256, collisions= 437(0.000000%), effective bits=28.091651 len= 512, collisions= 331(0.000000%), effective bits=28.492453 len= 1024, collisions= 219(0.000000%), effective bits=29.088353 ---- crc32 len= 1, collisions=488296915(0.390637%), effective bits=7.999957 len= 2, collisions= 1903782(0.001523%), effective bits=16.002703 len= 4, collisions= 22(0.000000%), effective bits=32.403708 len= 8, collisions= 29(0.000000%), effective bits=32.005159 len= 16, collisions= 30(0.000000%), effective bits=31.956249 len= 32, collisions= 28(0.000000%), effective bits=32.055785 len= 64, collisions= 39(0.000000%), effective bits=31.577738 len= 128, collisions= 39(0.000000%), effective bits=31.577738 len= 256, collisions= 32(0.000000%), effective bits=31.863140 len= 512, collisions= 32(0.000000%), effective bits=31.863140 len= 1024, collisions= 42(0.000000%), effective bits=31.470823
Note, generated with: check_collision.c