1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. 4 // 5 // A portable implementation of crc32c, optimized to handle 6 // four bytes at a time. 7 8 #include "util/crc32c.h" 9 10 #include <stdint.h> 11 #include "util/coding.h" 12 13 namespace leveldb { 14 namespace crc32c { 15 16 static const uint32_t table0_[256] = { 17 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 18 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb, 19 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b, 20 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 21 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b, 22 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384, 23 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 24 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b, 25 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a, 26 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 27 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5, 28 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa, 29 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 30 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a, 31 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a, 32 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 33 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48, 34 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957, 35 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 36 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198, 37 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927, 38 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 39 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8, 40 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7, 41 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 42 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789, 43 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859, 44 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 45 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9, 46 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6, 47 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 48 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829, 49 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c, 50 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 51 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043, 52 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c, 53 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 54 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc, 55 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c, 56 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 57 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652, 58 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d, 59 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 60 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982, 61 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d, 62 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 63 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2, 64 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed, 65 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 66 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f, 67 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff, 68 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 69 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f, 70 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540, 71 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 72 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f, 73 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee, 74 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 75 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321, 76 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e, 77 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 78 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e, 79 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e, 80 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351 81 }; 82 static const uint32_t table1_[256] = { 83 0x00000000, 0x13a29877, 0x274530ee, 0x34e7a899, 84 0x4e8a61dc, 0x5d28f9ab, 0x69cf5132, 0x7a6dc945, 85 0x9d14c3b8, 0x8eb65bcf, 0xba51f356, 0xa9f36b21, 86 0xd39ea264, 0xc03c3a13, 0xf4db928a, 0xe7790afd, 87 0x3fc5f181, 0x2c6769f6, 0x1880c16f, 0x0b225918, 88 0x714f905d, 0x62ed082a, 0x560aa0b3, 0x45a838c4, 89 0xa2d13239, 0xb173aa4e, 0x859402d7, 0x96369aa0, 90 0xec5b53e5, 0xfff9cb92, 0xcb1e630b, 0xd8bcfb7c, 91 0x7f8be302, 0x6c297b75, 0x58ced3ec, 0x4b6c4b9b, 92 0x310182de, 0x22a31aa9, 0x1644b230, 0x05e62a47, 93 0xe29f20ba, 0xf13db8cd, 0xc5da1054, 0xd6788823, 94 0xac154166, 0xbfb7d911, 0x8b507188, 0x98f2e9ff, 95 0x404e1283, 0x53ec8af4, 0x670b226d, 0x74a9ba1a, 96 0x0ec4735f, 0x1d66eb28, 0x298143b1, 0x3a23dbc6, 97 0xdd5ad13b, 0xcef8494c, 0xfa1fe1d5, 0xe9bd79a2, 98 0x93d0b0e7, 0x80722890, 0xb4958009, 0xa737187e, 99 0xff17c604, 0xecb55e73, 0xd852f6ea, 0xcbf06e9d, 100 0xb19da7d8, 0xa23f3faf, 0x96d89736, 0x857a0f41, 101 0x620305bc, 0x71a19dcb, 0x45463552, 0x56e4ad25, 102 0x2c896460, 0x3f2bfc17, 0x0bcc548e, 0x186eccf9, 103 0xc0d23785, 0xd370aff2, 0xe797076b, 0xf4359f1c, 104 0x8e585659, 0x9dface2e, 0xa91d66b7, 0xbabffec0, 105 0x5dc6f43d, 0x4e646c4a, 0x7a83c4d3, 0x69215ca4, 106 0x134c95e1, 0x00ee0d96, 0x3409a50f, 0x27ab3d78, 107 0x809c2506, 0x933ebd71, 0xa7d915e8, 0xb47b8d9f, 108 0xce1644da, 0xddb4dcad, 0xe9537434, 0xfaf1ec43, 109 0x1d88e6be, 0x0e2a7ec9, 0x3acdd650, 0x296f4e27, 110 0x53028762, 0x40a01f15, 0x7447b78c, 0x67e52ffb, 111 0xbf59d487, 0xacfb4cf0, 0x981ce469, 0x8bbe7c1e, 112 0xf1d3b55b, 0xe2712d2c, 0xd69685b5, 0xc5341dc2, 113 0x224d173f, 0x31ef8f48, 0x050827d1, 0x16aabfa6, 114 0x6cc776e3, 0x7f65ee94, 0x4b82460d, 0x5820de7a, 115 0xfbc3faf9, 0xe861628e, 0xdc86ca17, 0xcf245260, 116 0xb5499b25, 0xa6eb0352, 0x920cabcb, 0x81ae33bc, 117 0x66d73941, 0x7575a136, 0x419209af, 0x523091d8, 118 0x285d589d, 0x3bffc0ea, 0x0f186873, 0x1cbaf004, 119 0xc4060b78, 0xd7a4930f, 0xe3433b96, 0xf0e1a3e1, 120 0x8a8c6aa4, 0x992ef2d3, 0xadc95a4a, 0xbe6bc23d, 121 0x5912c8c0, 0x4ab050b7, 0x7e57f82e, 0x6df56059, 122 0x1798a91c, 0x043a316b, 0x30dd99f2, 0x237f0185, 123 0x844819fb, 0x97ea818c, 0xa30d2915, 0xb0afb162, 124 0xcac27827, 0xd960e050, 0xed8748c9, 0xfe25d0be, 125 0x195cda43, 0x0afe4234, 0x3e19eaad, 0x2dbb72da, 126 0x57d6bb9f, 0x447423e8, 0x70938b71, 0x63311306, 127 0xbb8de87a, 0xa82f700d, 0x9cc8d894, 0x8f6a40e3, 128 0xf50789a6, 0xe6a511d1, 0xd242b948, 0xc1e0213f, 129 0x26992bc2, 0x353bb3b5, 0x01dc1b2c, 0x127e835b, 130 0x68134a1e, 0x7bb1d269, 0x4f567af0, 0x5cf4e287, 131 0x04d43cfd, 0x1776a48a, 0x23910c13, 0x30339464, 132 0x4a5e5d21, 0x59fcc556, 0x6d1b6dcf, 0x7eb9f5b8, 133 0x99c0ff45, 0x8a626732, 0xbe85cfab, 0xad2757dc, 134 0xd74a9e99, 0xc4e806ee, 0xf00fae77, 0xe3ad3600, 135 0x3b11cd7c, 0x28b3550b, 0x1c54fd92, 0x0ff665e5, 136 0x759baca0, 0x663934d7, 0x52de9c4e, 0x417c0439, 137 0xa6050ec4, 0xb5a796b3, 0x81403e2a, 0x92e2a65d, 138 0xe88f6f18, 0xfb2df76f, 0xcfca5ff6, 0xdc68c781, 139 0x7b5fdfff, 0x68fd4788, 0x5c1aef11, 0x4fb87766, 140 0x35d5be23, 0x26772654, 0x12908ecd, 0x013216ba, 141 0xe64b1c47, 0xf5e98430, 0xc10e2ca9, 0xd2acb4de, 142 0xa8c17d9b, 0xbb63e5ec, 0x8f844d75, 0x9c26d502, 143 0x449a2e7e, 0x5738b609, 0x63df1e90, 0x707d86e7, 144 0x0a104fa2, 0x19b2d7d5, 0x2d557f4c, 0x3ef7e73b, 145 0xd98eedc6, 0xca2c75b1, 0xfecbdd28, 0xed69455f, 146 0x97048c1a, 0x84a6146d, 0xb041bcf4, 0xa3e32483 147 }; 148 static const uint32_t table2_[256] = { 149 0x00000000, 0xa541927e, 0x4f6f520d, 0xea2ec073, 150 0x9edea41a, 0x3b9f3664, 0xd1b1f617, 0x74f06469, 151 0x38513ec5, 0x9d10acbb, 0x773e6cc8, 0xd27ffeb6, 152 0xa68f9adf, 0x03ce08a1, 0xe9e0c8d2, 0x4ca15aac, 153 0x70a27d8a, 0xd5e3eff4, 0x3fcd2f87, 0x9a8cbdf9, 154 0xee7cd990, 0x4b3d4bee, 0xa1138b9d, 0x045219e3, 155 0x48f3434f, 0xedb2d131, 0x079c1142, 0xa2dd833c, 156 0xd62de755, 0x736c752b, 0x9942b558, 0x3c032726, 157 0xe144fb14, 0x4405696a, 0xae2ba919, 0x0b6a3b67, 158 0x7f9a5f0e, 0xdadbcd70, 0x30f50d03, 0x95b49f7d, 159 0xd915c5d1, 0x7c5457af, 0x967a97dc, 0x333b05a2, 160 0x47cb61cb, 0xe28af3b5, 0x08a433c6, 0xade5a1b8, 161 0x91e6869e, 0x34a714e0, 0xde89d493, 0x7bc846ed, 162 0x0f382284, 0xaa79b0fa, 0x40577089, 0xe516e2f7, 163 0xa9b7b85b, 0x0cf62a25, 0xe6d8ea56, 0x43997828, 164 0x37691c41, 0x92288e3f, 0x78064e4c, 0xdd47dc32, 165 0xc76580d9, 0x622412a7, 0x880ad2d4, 0x2d4b40aa, 166 0x59bb24c3, 0xfcfab6bd, 0x16d476ce, 0xb395e4b0, 167 0xff34be1c, 0x5a752c62, 0xb05bec11, 0x151a7e6f, 168 0x61ea1a06, 0xc4ab8878, 0x2e85480b, 0x8bc4da75, 169 0xb7c7fd53, 0x12866f2d, 0xf8a8af5e, 0x5de93d20, 170 0x29195949, 0x8c58cb37, 0x66760b44, 0xc337993a, 171 0x8f96c396, 0x2ad751e8, 0xc0f9919b, 0x65b803e5, 172 0x1148678c, 0xb409f5f2, 0x5e273581, 0xfb66a7ff, 173 0x26217bcd, 0x8360e9b3, 0x694e29c0, 0xcc0fbbbe, 174 0xb8ffdfd7, 0x1dbe4da9, 0xf7908dda, 0x52d11fa4, 175 0x1e704508, 0xbb31d776, 0x511f1705, 0xf45e857b, 176 0x80aee112, 0x25ef736c, 0xcfc1b31f, 0x6a802161, 177 0x56830647, 0xf3c29439, 0x19ec544a, 0xbcadc634, 178 0xc85da25d, 0x6d1c3023, 0x8732f050, 0x2273622e, 179 0x6ed23882, 0xcb93aafc, 0x21bd6a8f, 0x84fcf8f1, 180 0xf00c9c98, 0x554d0ee6, 0xbf63ce95, 0x1a225ceb, 181 0x8b277743, 0x2e66e53d, 0xc448254e, 0x6109b730, 182 0x15f9d359, 0xb0b84127, 0x5a968154, 0xffd7132a, 183 0xb3764986, 0x1637dbf8, 0xfc191b8b, 0x595889f5, 184 0x2da8ed9c, 0x88e97fe2, 0x62c7bf91, 0xc7862def, 185 0xfb850ac9, 0x5ec498b7, 0xb4ea58c4, 0x11abcaba, 186 0x655baed3, 0xc01a3cad, 0x2a34fcde, 0x8f756ea0, 187 0xc3d4340c, 0x6695a672, 0x8cbb6601, 0x29faf47f, 188 0x5d0a9016, 0xf84b0268, 0x1265c21b, 0xb7245065, 189 0x6a638c57, 0xcf221e29, 0x250cde5a, 0x804d4c24, 190 0xf4bd284d, 0x51fcba33, 0xbbd27a40, 0x1e93e83e, 191 0x5232b292, 0xf77320ec, 0x1d5de09f, 0xb81c72e1, 192 0xccec1688, 0x69ad84f6, 0x83834485, 0x26c2d6fb, 193 0x1ac1f1dd, 0xbf8063a3, 0x55aea3d0, 0xf0ef31ae, 194 0x841f55c7, 0x215ec7b9, 0xcb7007ca, 0x6e3195b4, 195 0x2290cf18, 0x87d15d66, 0x6dff9d15, 0xc8be0f6b, 196 0xbc4e6b02, 0x190ff97c, 0xf321390f, 0x5660ab71, 197 0x4c42f79a, 0xe90365e4, 0x032da597, 0xa66c37e9, 198 0xd29c5380, 0x77ddc1fe, 0x9df3018d, 0x38b293f3, 199 0x7413c95f, 0xd1525b21, 0x3b7c9b52, 0x9e3d092c, 200 0xeacd6d45, 0x4f8cff3b, 0xa5a23f48, 0x00e3ad36, 201 0x3ce08a10, 0x99a1186e, 0x738fd81d, 0xd6ce4a63, 202 0xa23e2e0a, 0x077fbc74, 0xed517c07, 0x4810ee79, 203 0x04b1b4d5, 0xa1f026ab, 0x4bdee6d8, 0xee9f74a6, 204 0x9a6f10cf, 0x3f2e82b1, 0xd50042c2, 0x7041d0bc, 205 0xad060c8e, 0x08479ef0, 0xe2695e83, 0x4728ccfd, 206 0x33d8a894, 0x96993aea, 0x7cb7fa99, 0xd9f668e7, 207 0x9557324b, 0x3016a035, 0xda386046, 0x7f79f238, 208 0x0b899651, 0xaec8042f, 0x44e6c45c, 0xe1a75622, 209 0xdda47104, 0x78e5e37a, 0x92cb2309, 0x378ab177, 210 0x437ad51e, 0xe63b4760, 0x0c158713, 0xa954156d, 211 0xe5f54fc1, 0x40b4ddbf, 0xaa9a1dcc, 0x0fdb8fb2, 212 0x7b2bebdb, 0xde6a79a5, 0x3444b9d6, 0x91052ba8 213 }; 214 static const uint32_t table3_[256] = { 215 0x00000000, 0xdd45aab8, 0xbf672381, 0x62228939, 216 0x7b2231f3, 0xa6679b4b, 0xc4451272, 0x1900b8ca, 217 0xf64463e6, 0x2b01c95e, 0x49234067, 0x9466eadf, 218 0x8d665215, 0x5023f8ad, 0x32017194, 0xef44db2c, 219 0xe964b13d, 0x34211b85, 0x560392bc, 0x8b463804, 220 0x924680ce, 0x4f032a76, 0x2d21a34f, 0xf06409f7, 221 0x1f20d2db, 0xc2657863, 0xa047f15a, 0x7d025be2, 222 0x6402e328, 0xb9474990, 0xdb65c0a9, 0x06206a11, 223 0xd725148b, 0x0a60be33, 0x6842370a, 0xb5079db2, 224 0xac072578, 0x71428fc0, 0x136006f9, 0xce25ac41, 225 0x2161776d, 0xfc24ddd5, 0x9e0654ec, 0x4343fe54, 226 0x5a43469e, 0x8706ec26, 0xe524651f, 0x3861cfa7, 227 0x3e41a5b6, 0xe3040f0e, 0x81268637, 0x5c632c8f, 228 0x45639445, 0x98263efd, 0xfa04b7c4, 0x27411d7c, 229 0xc805c650, 0x15406ce8, 0x7762e5d1, 0xaa274f69, 230 0xb327f7a3, 0x6e625d1b, 0x0c40d422, 0xd1057e9a, 231 0xaba65fe7, 0x76e3f55f, 0x14c17c66, 0xc984d6de, 232 0xd0846e14, 0x0dc1c4ac, 0x6fe34d95, 0xb2a6e72d, 233 0x5de23c01, 0x80a796b9, 0xe2851f80, 0x3fc0b538, 234 0x26c00df2, 0xfb85a74a, 0x99a72e73, 0x44e284cb, 235 0x42c2eeda, 0x9f874462, 0xfda5cd5b, 0x20e067e3, 236 0x39e0df29, 0xe4a57591, 0x8687fca8, 0x5bc25610, 237 0xb4868d3c, 0x69c32784, 0x0be1aebd, 0xd6a40405, 238 0xcfa4bccf, 0x12e11677, 0x70c39f4e, 0xad8635f6, 239 0x7c834b6c, 0xa1c6e1d4, 0xc3e468ed, 0x1ea1c255, 240 0x07a17a9f, 0xdae4d027, 0xb8c6591e, 0x6583f3a6, 241 0x8ac7288a, 0x57828232, 0x35a00b0b, 0xe8e5a1b3, 242 0xf1e51979, 0x2ca0b3c1, 0x4e823af8, 0x93c79040, 243 0x95e7fa51, 0x48a250e9, 0x2a80d9d0, 0xf7c57368, 244 0xeec5cba2, 0x3380611a, 0x51a2e823, 0x8ce7429b, 245 0x63a399b7, 0xbee6330f, 0xdcc4ba36, 0x0181108e, 246 0x1881a844, 0xc5c402fc, 0xa7e68bc5, 0x7aa3217d, 247 0x52a0c93f, 0x8fe56387, 0xedc7eabe, 0x30824006, 248 0x2982f8cc, 0xf4c75274, 0x96e5db4d, 0x4ba071f5, 249 0xa4e4aad9, 0x79a10061, 0x1b838958, 0xc6c623e0, 250 0xdfc69b2a, 0x02833192, 0x60a1b8ab, 0xbde41213, 251 0xbbc47802, 0x6681d2ba, 0x04a35b83, 0xd9e6f13b, 252 0xc0e649f1, 0x1da3e349, 0x7f816a70, 0xa2c4c0c8, 253 0x4d801be4, 0x90c5b15c, 0xf2e73865, 0x2fa292dd, 254 0x36a22a17, 0xebe780af, 0x89c50996, 0x5480a32e, 255 0x8585ddb4, 0x58c0770c, 0x3ae2fe35, 0xe7a7548d, 256 0xfea7ec47, 0x23e246ff, 0x41c0cfc6, 0x9c85657e, 257 0x73c1be52, 0xae8414ea, 0xcca69dd3, 0x11e3376b, 258 0x08e38fa1, 0xd5a62519, 0xb784ac20, 0x6ac10698, 259 0x6ce16c89, 0xb1a4c631, 0xd3864f08, 0x0ec3e5b0, 260 0x17c35d7a, 0xca86f7c2, 0xa8a47efb, 0x75e1d443, 261 0x9aa50f6f, 0x47e0a5d7, 0x25c22cee, 0xf8878656, 262 0xe1873e9c, 0x3cc29424, 0x5ee01d1d, 0x83a5b7a5, 263 0xf90696d8, 0x24433c60, 0x4661b559, 0x9b241fe1, 264 0x8224a72b, 0x5f610d93, 0x3d4384aa, 0xe0062e12, 265 0x0f42f53e, 0xd2075f86, 0xb025d6bf, 0x6d607c07, 266 0x7460c4cd, 0xa9256e75, 0xcb07e74c, 0x16424df4, 267 0x106227e5, 0xcd278d5d, 0xaf050464, 0x7240aedc, 268 0x6b401616, 0xb605bcae, 0xd4273597, 0x09629f2f, 269 0xe6264403, 0x3b63eebb, 0x59416782, 0x8404cd3a, 270 0x9d0475f0, 0x4041df48, 0x22635671, 0xff26fcc9, 271 0x2e238253, 0xf36628eb, 0x9144a1d2, 0x4c010b6a, 272 0x5501b3a0, 0x88441918, 0xea669021, 0x37233a99, 273 0xd867e1b5, 0x05224b0d, 0x6700c234, 0xba45688c, 274 0xa345d046, 0x7e007afe, 0x1c22f3c7, 0xc167597f, 275 0xc747336e, 0x1a0299d6, 0x782010ef, 0xa565ba57, 276 0xbc65029d, 0x6120a825, 0x0302211c, 0xde478ba4, 277 0x31035088, 0xec46fa30, 0x8e647309, 0x5321d9b1, 278 0x4a21617b, 0x9764cbc3, 0xf54642fa, 0x2803e842 279 }; 280 281 // Used to fetch a naturally-aligned 32-bit word in little endian byte-order 282 static inline uint32_t LE_LOAD32(const uint8_t *p) { 283 return DecodeFixed32(reinterpret_cast<const char*>(p)); 284 } 285 286 uint32_t Extend(uint32_t crc, const char* buf, size_t size) { 287 const uint8_t *p = reinterpret_cast<const uint8_t *>(buf); 288 const uint8_t *e = p + size; 289 uint32_t l = crc ^ 0xffffffffu; 290 291 #define STEP1 do { \ 292 int c = (l & 0xff) ^ *p++; \ 293 l = table0_[c] ^ (l >> 8); \ 294 } while (0) 295 #define STEP4 do { \ 296 uint32_t c = l ^ LE_LOAD32(p); \ 297 p += 4; \ 298 l = table3_[c & 0xff] ^ \ 299 table2_[(c >> 8) & 0xff] ^ \ 300 table1_[(c >> 16) & 0xff] ^ \ 301 table0_[c >> 24]; \ 302 } while (0) 303 304 // Point x at first 4-byte aligned byte in string. This might be 305 // just past the end of the string. 306 const uintptr_t pval = reinterpret_cast<uintptr_t>(p); 307 const uint8_t* x = reinterpret_cast<const uint8_t*>(((pval + 3) >> 2) << 2); 308 if (x <= e) { 309 // Process bytes until finished or p is 4-byte aligned 310 while (p != x) { 311 STEP1; 312 } 313 } 314 // Process bytes 16 at a time 315 while ((e-p) >= 16) { 316 STEP4; STEP4; STEP4; STEP4; 317 } 318 // Process bytes 4 at a time 319 while ((e-p) >= 4) { 320 STEP4; 321 } 322 // Process the last few bytes 323 while (p != e) { 324 STEP1; 325 } 326 #undef STEP4 327 #undef STEP1 328 return l ^ 0xffffffffu; 329 } 330 331 } // namespace crc32c 332 } // namespace leveldb 333