Feathercoin  0.5.0
P2P Digital Currency
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
crc32c.cc
Go to the documentation of this file.
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
uint32_t DecodeFixed32(const char *ptr)
Definition: coding.h:58
unsigned char uint8_t
Definition: stdint.h:19
#define STEP1
unsigned int uint32_t
Definition: stdint.h:21
#define STEP4
uint32_t Extend(uint32_t crc, const char *buf, size_t size)
Definition: crc32c.cc:286