Header And Logo

PostgreSQL
| The world's most advanced open source database.

crc32.c

Go to the documentation of this file.
00001 /*
00002  * contrib/hstore/crc32.c
00003  *
00004  * Both POSIX and CRC32 checksums */
00005 
00006 #include <sys/types.h>
00007 #include <stdio.h>
00008 #include <sys/types.h>
00009 
00010 #include "crc32.h"
00011 
00012 /*
00013  * This code implements the AUTODIN II polynomial
00014  * The variable corresponding to the macro argument "crc" should
00015  * be an unsigned long.
00016  * Original code  by Spencer Garrett <[email protected]>
00017  */
00018 
00019 #define _CRC32_(crc, ch)     (crc = (crc >> 8) ^ crc32tab[(crc ^ (ch)) & 0xff])
00020 
00021 /* generated using the AUTODIN II polynomial
00022  *  x^32 + x^26 + x^23 + x^22 + x^16 +
00023  *  x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
00024  */
00025 
00026 static const unsigned int crc32tab[256] = {
00027     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
00028     0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
00029     0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
00030     0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
00031     0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
00032     0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
00033     0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
00034     0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
00035     0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
00036     0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
00037     0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
00038     0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
00039     0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
00040     0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
00041     0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
00042     0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
00043     0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
00044     0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
00045     0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
00046     0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
00047     0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
00048     0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
00049     0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
00050     0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
00051     0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
00052     0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
00053     0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
00054     0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
00055     0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
00056     0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
00057     0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
00058     0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
00059     0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
00060     0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
00061     0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
00062     0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
00063     0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
00064     0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
00065     0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
00066     0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
00067     0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
00068     0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
00069     0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
00070     0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
00071     0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
00072     0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
00073     0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
00074     0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
00075     0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
00076     0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
00077     0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
00078     0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
00079     0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
00080     0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
00081     0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
00082     0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
00083     0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
00084     0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
00085     0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
00086     0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
00087     0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
00088     0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
00089     0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
00090     0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
00091 };
00092 
00093 unsigned int
00094 crc32_sz(char *buf, int size)
00095 {
00096     unsigned int crc = ~((unsigned int) 0);
00097     char       *p;
00098     int         len,
00099                 nr;
00100 
00101     len = 0;
00102     nr = size;
00103     for (len += nr, p = buf; nr--; ++p)
00104         _CRC32_(crc, *p);
00105     return ~crc;
00106 }