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.
5
// A portable implementation of crc32c, optimized to handle
6
// four bytes at a time.
8
#include "util/crc32c.h"
11
#include "util/coding.h"
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
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
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
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
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));
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;
292
int c = (l & 0xff) ^ *p++; \
293
l = table0_[c] ^ (l >> 8); \
296
uint32_t c = l ^ LE_LOAD32(p); \
298
l = table3_[c & 0xff] ^ \
299
table2_[(c >> 8) & 0xff] ^ \
300
table1_[(c >> 16) & 0xff] ^ \
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);
309
// Process bytes until finished or p is 4-byte aligned
314
// Process bytes 16 at a time
315
while ((e-p) >= 16) {
316
STEP4; STEP4; STEP4; STEP4;
318
// Process bytes 4 at a time
322
// Process the last few bytes
328
return l ^ 0xffffffffu;
331
} // namespace crc32c
332
} // namespace leveldb