View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.codec.digest;
18  
19  import java.util.zip.Checksum;
20  
21  /**
22   * A pure-Java implementation of the CRC32 checksum that uses
23   * the same polynomial as the built-in native CRC32.
24   *
25   * <p>
26   * This is to avoid the JNI overhead for certain uses of checksumming
27   * where many small pieces of data are checksummed in succession.
28   * </p>
29   * <p>
30   * The current version is ~10x to 1.8x as fast as Sun's native
31   * java.util.zip.CRC32 in Java 1.6
32   * </p>
33   * <p>
34   * Copied from Apache Hadoop 2.6.3.
35   * The code agrees with the following file in the 2.6.3 tag:
36   * https://gitbox.apache.org/repos/asf?p=hadoop.git;a=blob_plain;
37   * f=hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/PureJavaCrc32.java;
38   * hb=2120de588b92b9f22b1cc4188761d6a8c61aa778
39   * </p>
40   * <p>
41   * This class is Not ThreadSafe
42   * </p>
43   *
44   * @see java.util.zip.CRC32
45   * @since 1.11
46   */
47  public class PureJavaCrc32 implements Checksum {
48  
49      /**
50       * CRC-32 lookup tables generated by the polynomial 0xEDB88320.
51       * See also TestPureJavaCrc32.Table.
52       */
53      // @formatter:off
54      private static final int[] T = {
55        /* T8_0 */
56        0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
57        0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
58        0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
59        0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
60        0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
61        0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
62        0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
63        0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
64        0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
65        0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
66        0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
67        0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
68        0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
69        0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
70        0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
71        0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
72        0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
73        0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
74        0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
75        0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
76        0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
77        0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
78        0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
79        0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
80        0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
81        0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
82        0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
83        0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
84        0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
85        0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
86        0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
87        0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
88        0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
89        0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
90        0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
91        0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
92        0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
93        0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
94        0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
95        0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
96        0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
97        0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
98        0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
99        0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
100       0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
101       0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
102       0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
103       0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
104       0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
105       0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
106       0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
107       0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
108       0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
109       0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
110       0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
111       0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
112       0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
113       0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
114       0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
115       0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
116       0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
117       0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
118       0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
119       0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
120       /* T8_1 */
121       0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3,
122       0x646CC504, 0x7D77F445, 0x565AA786, 0x4F4196C7,
123       0xC8D98A08, 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB,
124       0xACB54F0C, 0xB5AE7E4D, 0x9E832D8E, 0x87981CCF,
125       0x4AC21251, 0x53D92310, 0x78F470D3, 0x61EF4192,
126       0x2EAED755, 0x37B5E614, 0x1C98B5D7, 0x05838496,
127       0x821B9859, 0x9B00A918, 0xB02DFADB, 0xA936CB9A,
128       0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E,
129       0x958424A2, 0x8C9F15E3, 0xA7B24620, 0xBEA97761,
130       0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265,
131       0x5D5DAEAA, 0x44469FEB, 0x6F6BCC28, 0x7670FD69,
132       0x39316BAE, 0x202A5AEF, 0x0B07092C, 0x121C386D,
133       0xDF4636F3, 0xC65D07B2, 0xED705471, 0xF46B6530,
134       0xBB2AF3F7, 0xA231C2B6, 0x891C9175, 0x9007A034,
135       0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38,
136       0x73F379FF, 0x6AE848BE, 0x41C51B7D, 0x58DE2A3C,
137       0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6,
138       0x94158A01, 0x8D0EBB40, 0xA623E883, 0xBF38D9C2,
139       0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE,
140       0x5CCC0009, 0x45D73148, 0x6EFA628B, 0x77E153CA,
141       0xBABB5D54, 0xA3A06C15, 0x888D3FD6, 0x91960E97,
142       0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93,
143       0x7262D75C, 0x6B79E61D, 0x4054B5DE, 0x594F849F,
144       0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B,
145       0x65FD6BA7, 0x7CE65AE6, 0x57CB0925, 0x4ED03864,
146       0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60,
147       0xAD24E1AF, 0xB43FD0EE, 0x9F12832D, 0x8609B26C,
148       0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768,
149       0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35,
150       0x4B53BCF2, 0x52488DB3, 0x7965DE70, 0x607EEF31,
151       0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D,
152       0x838A36FA, 0x9A9107BB, 0xB1BC5478, 0xA8A76539,
153       0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88,
154       0x5FEF5D4F, 0x46F46C0E, 0x6DD93FCD, 0x74C20E8C,
155       0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180,
156       0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484,
157       0x71418A1A, 0x685ABB5B, 0x4377E898, 0x5A6CD9D9,
158       0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD,
159       0xB9980012, 0xA0833153, 0x8BAE6290, 0x92B553D1,
160       0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5,
161       0xAE07BCE9, 0xB71C8DA8, 0x9C31DE6B, 0x852AEF2A,
162       0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E,
163       0x66DE36E1, 0x7FC507A0, 0x54E85463, 0x4DF36522,
164       0x02B2F3E5, 0x1BA9C2A4, 0x30849167, 0x299FA026,
165       0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B,
166       0x80A96BBC, 0x99B25AFD, 0xB29F093E, 0xAB84387F,
167       0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773,
168       0x4870E1B4, 0x516BD0F5, 0x7A468336, 0x635DB277,
169       0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D,
170       0xAF96124A, 0xB68D230B, 0x9DA070C8, 0x84BB4189,
171       0x03235D46, 0x1A386C07, 0x31153FC4, 0x280E0E85,
172       0x674F9842, 0x7E54A903, 0x5579FAC0, 0x4C62CB81,
173       0x8138C51F, 0x9823F45E, 0xB30EA79D, 0xAA1596DC,
174       0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8,
175       0x49E14F17, 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4,
176       0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0,
177       0x5E7EF3EC, 0x4765C2AD, 0x6C48916E, 0x7553A02F,
178       0x3A1236E8, 0x230907A9, 0x0824546A, 0x113F652B,
179       0x96A779E4, 0x8FBC48A5, 0xA4911B66, 0xBD8A2A27,
180       0xF2CBBCE0, 0xEBD08DA1, 0xC0FDDE62, 0xD9E6EF23,
181       0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, 0x3F91B27E,
182       0x70D024B9, 0x69CB15F8, 0x42E6463B, 0x5BFD777A,
183       0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876,
184       0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72,
185       /* T8_2 */
186       0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59,
187       0x0709A8DC, 0x06CBC2EB, 0x048D7CB2, 0x054F1685,
188       0x0E1351B8, 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1,
189       0x091AF964, 0x08D89353, 0x0A9E2D0A, 0x0B5C473D,
190       0x1C26A370, 0x1DE4C947, 0x1FA2771E, 0x1E601D29,
191       0x1B2F0BAC, 0x1AED619B, 0x18ABDFC2, 0x1969B5F5,
192       0x1235F2C8, 0x13F798FF, 0x11B126A6, 0x10734C91,
193       0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D,
194       0x384D46E0, 0x398F2CD7, 0x3BC9928E, 0x3A0BF8B9,
195       0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065,
196       0x365E1758, 0x379C7D6F, 0x35DAC336, 0x3418A901,
197       0x3157BF84, 0x3095D5B3, 0x32D36BEA, 0x331101DD,
198       0x246BE590, 0x25A98FA7, 0x27EF31FE, 0x262D5BC9,
199       0x23624D4C, 0x22A0277B, 0x20E69922, 0x2124F315,
200       0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71,
201       0x2D711CF4, 0x2CB376C3, 0x2EF5C89A, 0x2F37A2AD,
202       0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399,
203       0x7793251C, 0x76514F2B, 0x7417F172, 0x75D59B45,
204       0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221,
205       0x798074A4, 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD,
206       0x6CBC2EB0, 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9,
207       0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835,
208       0x62AF7F08, 0x636D153F, 0x612BAB66, 0x60E9C151,
209       0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D,
210       0x48D7CB20, 0x4915A117, 0x4B531F4E, 0x4A917579,
211       0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5,
212       0x46C49A98, 0x4706F0AF, 0x45404EF6, 0x448224C1,
213       0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D,
214       0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609,
215       0x53F8C08C, 0x523AAABB, 0x507C14E2, 0x51BE7ED5,
216       0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1,
217       0x5DEB9134, 0x5C29FB03, 0x5E6F455A, 0x5FAD2F6D,
218       0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9,
219       0xE63CB35C, 0xE7FED96B, 0xE5B86732, 0xE47A0D05,
220       0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461,
221       0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD,
222       0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E, 0xFF5506A9,
223       0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75,
224       0xF300E948, 0xF2C2837F, 0xF0843D26, 0xF1465711,
225       0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD,
226       0xD9785D60, 0xD8BA3757, 0xDAFC890E, 0xDB3EE339,
227       0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5,
228       0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, 0xD52DB281,
229       0xD062A404, 0xD1A0CE33, 0xD3E6706A, 0xD2241A5D,
230       0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049,
231       0xC25756CC, 0xC3953CFB, 0xC1D382A2, 0xC011E895,
232       0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1,
233       0xCC440774, 0xCD866D43, 0xCFC0D31A, 0xCE02B92D,
234       0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819,
235       0x96A63E9C, 0x976454AB, 0x9522EAF2, 0x94E080C5,
236       0x9FBCC7F8, 0x9E7EADCF, 0x9C381396, 0x9DFA79A1,
237       0x98B56F24, 0x99770513, 0x9B31BB4A, 0x9AF3D17D,
238       0x8D893530, 0x8C4B5F07, 0x8E0DE15E, 0x8FCF8B69,
239       0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5,
240       0x839A6488, 0x82580EBF, 0x801EB0E6, 0x81DCDAD1,
241       0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D,
242       0xA9E2D0A0, 0xA820BA97, 0xAA6604CE, 0xABA46EF9,
243       0xAEEB787C, 0xAF29124B, 0xAD6FAC12, 0xACADC625,
244       0xA7F18118, 0xA633EB2F, 0xA4755576, 0xA5B73F41,
245       0xA0F829C4, 0xA13A43F3, 0xA37CFDAA, 0xA2BE979D,
246       0xB5C473D0, 0xB40619E7, 0xB640A7BE, 0xB782CD89,
247       0xB2CDDB0C, 0xB30FB13B, 0xB1490F62, 0xB08B6555,
248       0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31,
249       0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED,
250       /* T8_3 */
251       0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE,
252       0x8F629757, 0x37DEF032, 0x256B5FDC, 0x9DD738B9,
253       0xC5B428EF, 0x7D084F8A, 0x6FBDE064, 0xD7018701,
254       0x4AD6BFB8, 0xF26AD8DD, 0xE0DF7733, 0x58631056,
255       0x5019579F, 0xE8A530FA, 0xFA109F14, 0x42ACF871,
256       0xDF7BC0C8, 0x67C7A7AD, 0x75720843, 0xCDCE6F26,
257       0x95AD7F70, 0x2D111815, 0x3FA4B7FB, 0x8718D09E,
258       0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9,
259       0xA032AF3E, 0x188EC85B, 0x0A3B67B5, 0xB28700D0,
260       0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787,
261       0x658687D1, 0xDD3AE0B4, 0xCF8F4F5A, 0x7733283F,
262       0xEAE41086, 0x525877E3, 0x40EDD80D, 0xF851BF68,
263       0xF02BF8A1, 0x48979FC4, 0x5A22302A, 0xE29E574F,
264       0x7F496FF6, 0xC7F50893, 0xD540A77D, 0x6DFCC018,
265       0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0,
266       0xBAFD4719, 0x0241207C, 0x10F48F92, 0xA848E8F7,
267       0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3,
268       0x1476CF6A, 0xACCAA80F, 0xBE7F07E1, 0x06C36084,
269       0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C,
270       0xD1C2E785, 0x697E80E0, 0x7BCB2F0E, 0xC377486B,
271       0xCB0D0FA2, 0x73B168C7, 0x6104C729, 0xD9B8A04C,
272       0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B,
273       0x0EB9274D, 0xB6054028, 0xA4B0EFC6, 0x1C0C88A3,
274       0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4,
275       0x3B26F703, 0x839A9066, 0x912F3F88, 0x299358ED,
276       0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA,
277       0xFE92DFEC, 0x462EB889, 0x549B1767, 0xEC277002,
278       0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755,
279       0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72,
280       0xE45D37CB, 0x5CE150AE, 0x4E54FF40, 0xF6E89825,
281       0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D,
282       0x21E91F24, 0x99557841, 0x8BE0D7AF, 0x335CB0CA,
283       0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5,
284       0x623B216C, 0xDA874609, 0xC832E9E7, 0x708E8E82,
285       0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A,
286       0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D,
287       0xBD40E1A4, 0x05FC86C1, 0x1749292F, 0xAFF54E4A,
288       0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D,
289       0x78F4C94B, 0xC048AE2E, 0xD2FD01C0, 0x6A4166A5,
290       0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2,
291       0x4D6B1905, 0xF5D77E60, 0xE762D18E, 0x5FDEB6EB,
292       0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC,
293       0x88DF31EA, 0x3063568F, 0x22D6F961, 0x9A6A9E04,
294       0x07BDA6BD, 0xBF01C1D8, 0xADB46E36, 0x15080953,
295       0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174,
296       0x9210D9CD, 0x2AACBEA8, 0x38191146, 0x80A57623,
297       0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B,
298       0x57A4F122, 0xEF189647, 0xFDAD39A9, 0x45115ECC,
299       0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8,
300       0xF92F7951, 0x41931E34, 0x5326B1DA, 0xEB9AD6BF,
301       0xB3F9C6E9, 0x0B45A18C, 0x19F00E62, 0xA14C6907,
302       0x3C9B51BE, 0x842736DB, 0x96929935, 0x2E2EFE50,
303       0x2654B999, 0x9EE8DEFC, 0x8C5D7112, 0x34E11677,
304       0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120,
305       0xE3E09176, 0x5B5CF613, 0x49E959FD, 0xF1553E98,
306       0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF,
307       0xD67F4138, 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6,
308       0x591DD66F, 0xE1A1B10A, 0xF3141EE4, 0x4BA87981,
309       0x13CB69D7, 0xAB770EB2, 0xB9C2A15C, 0x017EC639,
310       0x9CA9FE80, 0x241599E5, 0x36A0360B, 0x8E1C516E,
311       0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, 0x94D3B949,
312       0x090481F0, 0xB1B8E695, 0xA30D497B, 0x1BB12E1E,
313       0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6,
314       0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1,
315       /* T8_4 */
316       0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0,
317       0xF580A6C0, 0xC8E08F70, 0x8F40F5A0, 0xB220DC10,
318       0x30704BC1, 0x0D106271, 0x4AB018A1, 0x77D03111,
319       0xC5F0ED01, 0xF890C4B1, 0xBF30BE61, 0x825097D1,
320       0x60E09782, 0x5D80BE32, 0x1A20C4E2, 0x2740ED52,
321       0x95603142, 0xA80018F2, 0xEFA06222, 0xD2C04B92,
322       0x5090DC43, 0x6DF0F5F3, 0x2A508F23, 0x1730A693,
323       0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053,
324       0xC1C12F04, 0xFCA106B4, 0xBB017C64, 0x866155D4,
325       0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314,
326       0xF1B164C5, 0xCCD14D75, 0x8B7137A5, 0xB6111E15,
327       0x0431C205, 0x3951EBB5, 0x7EF19165, 0x4391B8D5,
328       0xA121B886, 0x9C419136, 0xDBE1EBE6, 0xE681C256,
329       0x54A11E46, 0x69C137F6, 0x2E614D26, 0x13016496,
330       0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997,
331       0x64D15587, 0x59B17C37, 0x1E1106E7, 0x23712F57,
332       0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299,
333       0xAD73FE89, 0x9013D739, 0xD7B3ADE9, 0xEAD38459,
334       0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958,
335       0x9D03B548, 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98,
336       0x3813CFCB, 0x0573E67B, 0x42D39CAB, 0x7FB3B51B,
337       0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB,
338       0x0863840A, 0x3503ADBA, 0x72A3D76A, 0x4FC3FEDA,
339       0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A,
340       0x9932774D, 0xA4525EFD, 0xE3F2242D, 0xDE920D9D,
341       0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D,
342       0xA9423C8C, 0x9422153C, 0xD3826FEC, 0xEEE2465C,
343       0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C,
344       0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F,
345       0x0C52460F, 0x31326FBF, 0x7692156F, 0x4BF23CDF,
346       0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE,
347       0x3C220DCE, 0x0142247E, 0x46E25EAE, 0x7B82771E,
348       0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42,
349       0x44661652, 0x79063FE2, 0x3EA64532, 0x03C66C82,
350       0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183,
351       0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743,
352       0xD1062710, 0xEC660EA0, 0xABC67470, 0x96A65DC0,
353       0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00,
354       0xE1766CD1, 0xDC164561, 0x9BB63FB1, 0xA6D61601,
355       0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1,
356       0x70279F96, 0x4D47B626, 0x0AE7CCF6, 0x3787E546,
357       0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386,
358       0x4057D457, 0x7D37FDE7, 0x3A978737, 0x07F7AE87,
359       0xB5D77297, 0x88B75B27, 0xCF1721F7, 0xF2770847,
360       0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4,
361       0xE547AED4, 0xD8278764, 0x9F87FDB4, 0xA2E7D404,
362       0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905,
363       0xD537E515, 0xE857CCA5, 0xAFF7B675, 0x92979FC5,
364       0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B,
365       0x1C954E1B, 0x21F567AB, 0x66551D7B, 0x5B3534CB,
366       0xD965A31A, 0xE4058AAA, 0xA3A5F07A, 0x9EC5D9CA,
367       0x2CE505DA, 0x11852C6A, 0x562556BA, 0x6B457F0A,
368       0x89F57F59, 0xB49556E9, 0xF3352C39, 0xCE550589,
369       0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349,
370       0xB9853498, 0x84E51D28, 0xC34567F8, 0xFE254E48,
371       0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888,
372       0x28D4C7DF, 0x15B4EE6F, 0x521494BF, 0x6F74BD0F,
373       0xDD54611F, 0xE03448AF, 0xA794327F, 0x9AF41BCF,
374       0x18A48C1E, 0x25C4A5AE, 0x6264DF7E, 0x5F04F6CE,
375       0xED242ADE, 0xD044036E, 0x97E479BE, 0xAA84500E,
376       0x4834505D, 0x755479ED, 0x32F4033D, 0x0F942A8D,
377       0xBDB4F69D, 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D,
378       0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C,
379       0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C,
380       /* T8_5 */
381       0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE,
382       0x9B914216, 0x50CD91B3, 0xD659E31D, 0x1D0530B8,
383       0xEC53826D, 0x270F51C8, 0xA19B2366, 0x6AC7F0C3,
384       0x77C2C07B, 0xBC9E13DE, 0x3A0A6170, 0xF156B2D5,
385       0x03D6029B, 0xC88AD13E, 0x4E1EA390, 0x85427035,
386       0x9847408D, 0x531B9328, 0xD58FE186, 0x1ED33223,
387       0xEF8580F6, 0x24D95353, 0xA24D21FD, 0x6911F258,
388       0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E,
389       0x07AC0536, 0xCCF0D693, 0x4A64A43D, 0x81387798,
390       0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E,
391       0xEBFF875B, 0x20A354FE, 0xA6372650, 0x6D6BF5F5,
392       0x706EC54D, 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3,
393       0x047A07AD, 0xCF26D408, 0x49B2A6A6, 0x82EE7503,
394       0x9FEB45BB, 0x54B7961E, 0xD223E4B0, 0x197F3715,
395       0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E,
396       0x73B8C7D6, 0xB8E41473, 0x3E7066DD, 0xF52CB578,
397       0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2,
398       0x94C9487A, 0x5F959BDF, 0xD901E971, 0x125D3AD4,
399       0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF,
400       0x789ACA17, 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9,
401       0x0C8E08F7, 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59,
402       0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F,
403       0xE0DD8A9A, 0x2B81593F, 0xAD152B91, 0x6649F834,
404       0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22,
405       0x08F40F5A, 0xC3A8DCFF, 0x453CAE51, 0x8E607DF4,
406       0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2,
407       0xE4A78D37, 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99,
408       0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F,
409       0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F,
410       0x90B34FD7, 0x5BEF9C72, 0xDD7BEEDC, 0x16273D79,
411       0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02,
412       0x7CE0CDBA, 0xB7BC1E1F, 0x31286CB1, 0xFA74BF14,
413       0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676,
414       0x852156CE, 0x4E7D856B, 0xC8E9F7C5, 0x03B52460,
415       0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B,
416       0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D,
417       0x1D661643, 0xD63AC5E6, 0x50AEB748, 0x9BF264ED,
418       0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB,
419       0xF135942E, 0x3A69478B, 0xBCFD3525, 0x77A1E680,
420       0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496,
421       0x191C11EE, 0xD240C24B, 0x54D4B0E5, 0x9F886340,
422       0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156,
423       0xF54F9383, 0x3E134026, 0xB8873288, 0x73DBE12D,
424       0x6EDED195, 0xA5820230, 0x2316709E, 0xE84AA33B,
425       0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB,
426       0x815B5163, 0x4A0782C6, 0xCC93F068, 0x07CF23CD,
427       0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6,
428       0x6D08D30E, 0xA65400AB, 0x20C07205, 0xEB9CA1A0,
429       0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A,
430       0x8A795CA2, 0x41258F07, 0xC7B1FDA9, 0x0CED2E0C,
431       0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2, 0x7B2FEE77,
432       0x662ADECF, 0xAD760D6A, 0x2BE27FC4, 0xE0BEAC61,
433       0x123E1C2F, 0xD962CF8A, 0x5FF6BD24, 0x94AA6E81,
434       0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97,
435       0xFE6D9E42, 0x35314DE7, 0xB3A53F49, 0x78F9ECEC,
436       0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA,
437       0x16441B82, 0xDD18C827, 0x5B8CBA89, 0x90D0692C,
438       0x8DD55994, 0x46898A31, 0xC01DF89F, 0x0B412B3A,
439       0xFA1799EF, 0x314B4A4A, 0xB7DF38E4, 0x7C83EB41,
440       0x6186DBF9, 0xAADA085C, 0x2C4E7AF2, 0xE712A957,
441       0x15921919, 0xDECECABC, 0x585AB812, 0x93066BB7,
442       0x8E035B0F, 0x455F88AA, 0xC3CBFA04, 0x089729A1,
443       0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA,
444       0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC,
445       /* T8_6 */
446       0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D,
447       0xF44F2413, 0x52382FA7, 0x63D0353A, 0xC5A73E8E,
448       0x33EF4E67, 0x959845D3, 0xA4705F4E, 0x020754FA,
449       0xC7A06A74, 0x61D761C0, 0x503F7B5D, 0xF64870E9,
450       0x67DE9CCE, 0xC1A9977A, 0xF0418DE7, 0x56368653,
451       0x9391B8DD, 0x35E6B369, 0x040EA9F4, 0xA279A240,
452       0x5431D2A9, 0xF246D91D, 0xC3AEC380, 0x65D9C834,
453       0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27,
454       0xCFBD399C, 0x69CA3228, 0x582228B5, 0xFE552301,
455       0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712,
456       0xFC5277FB, 0x5A257C4F, 0x6BCD66D2, 0xCDBA6D66,
457       0x081D53E8, 0xAE6A585C, 0x9F8242C1, 0x39F54975,
458       0xA863A552, 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF,
459       0x5C2C8141, 0xFA5B8AF5, 0xCBB39068, 0x6DC49BDC,
460       0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8,
461       0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F, 0x5E2BD5BB,
462       0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4,
463       0xB044516A, 0x16335ADE, 0x27DB4043, 0x81AC4BF7,
464       0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183,
465       0x83AB1F0D, 0x25DC14B9, 0x14340E24, 0xB2430590,
466       0x23D5E9B7, 0x85A2E203, 0xB44AF89E, 0x123DF32A,
467       0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739,
468       0x103AA7D0, 0xB64DAC64, 0x87A5B6F9, 0x21D2BD4D,
469       0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E,
470       0x8BB64CE5, 0x2DC14751, 0x1C295DCC, 0xBA5E5678,
471       0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B,
472       0xB8590282, 0x1E2E0936, 0x2FC613AB, 0x89B1181F,
473       0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C,
474       0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6,
475       0x1827F438, 0xBE50FF8C, 0x8FB8E511, 0x29CFEEA5,
476       0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1,
477       0x2BC8BA5F, 0x8DBFB1EB, 0xBC57AB76, 0x1A20A0C2,
478       0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F,
479       0x7C59CEE1, 0xDA2EC555, 0xEBC6DFC8, 0x4DB1D47C,
480       0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08,
481       0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B,
482       0xEFC8763C, 0x49BF7D88, 0x78576715, 0xDE206CA1,
483       0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2,
484       0xDC27385B, 0x7A5033EF, 0x4BB82972, 0xEDCF22C6,
485       0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5,
486       0x47ABD36E, 0xE1DCD8DA, 0xD034C247, 0x7643C9F3,
487       0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0,
488       0x74449D09, 0xD23396BD, 0xE3DB8C20, 0x45AC8794,
489       0x800BB91A, 0x267CB2AE, 0x1794A833, 0xB1E3A387,
490       0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D,
491       0xD43A6BB3, 0x724D6007, 0x43A57A9A, 0xE5D2712E,
492       0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A,
493       0xE7D525D4, 0x41A22E60, 0x704A34FD, 0xD63D3F49,
494       0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516,
495       0x3852BB98, 0x9E25B02C, 0xAFCDAAB1, 0x09BAA105,
496       0xFFF2D1EC, 0x5985DA58, 0x686DC0C5, 0xCE1ACB71,
497       0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, 0x3A55EF62,
498       0xABC30345, 0x0DB408F1, 0x3C5C126C, 0x9A2B19D8,
499       0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB,
500       0x982C4D22, 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF,
501       0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC,
502       0x03A0A617, 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A,
503       0xF7EF8204, 0x519889B0, 0x6070932D, 0xC6079899,
504       0x304FE870, 0x9638E3C4, 0xA7D0F959, 0x01A7F2ED,
505       0xC400CC63, 0x6277C7D7, 0x539FDD4A, 0xF5E8D6FE,
506       0x647E3AD9, 0xC209316D, 0xF3E12BF0, 0x55962044,
507       0x90311ECA, 0x3646157E, 0x07AE0FE3, 0xA1D90457,
508       0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23,
509       0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30,
510       /* T8_7 */
511       0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3,
512       0x844A0EFA, 0x48E00E64, 0xC66F0987, 0x0AC50919,
513       0xD3E51BB5, 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56,
514       0x57AF154F, 0x9B0515D1, 0x158A1232, 0xD92012AC,
515       0x7CBB312B, 0xB01131B5, 0x3E9E3656, 0xF23436C8,
516       0xF8F13FD1, 0x345B3F4F, 0xBAD438AC, 0x767E3832,
517       0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, 0x21D12D7D,
518       0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387,
519       0xF9766256, 0x35DC62C8, 0xBB53652B, 0x77F965B5,
520       0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F,
521       0x2A9379E3, 0xE639797D, 0x68B67E9E, 0xA41C7E00,
522       0xAED97719, 0x62737787, 0xECFC7064, 0x205670FA,
523       0x85CD537D, 0x496753E3, 0xC7E85400, 0x0B42549E,
524       0x01875D87, 0xCD2D5D19, 0x43A25AFA, 0x8F085A64,
525       0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B,
526       0xD2624632, 0x1EC846AC, 0x9047414F, 0x5CED41D1,
527       0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E,
528       0xADD7CC17, 0x617DCC89, 0xEFF2CB6A, 0x2358CBF4,
529       0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB,
530       0x7E32D7A2, 0xB298D73C, 0x3C17D0DF, 0xF0BDD041,
531       0x5526F3C6, 0x998CF358, 0x1703F4BB, 0xDBA9F425,
532       0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF,
533       0x86C3E873, 0x4A69E8ED, 0xC4E6EF0E, 0x084CEF90,
534       0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A,
535       0xD0EBA0BB, 0x1C41A025, 0x92CEA7C6, 0x5E64A758,
536       0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2,
537       0x030EBB0E, 0xCFA4BB90, 0x412BBC73, 0x8D81BCED,
538       0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217,
539       0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673,
540       0x281A9F6A, 0xE4B09FF4, 0x6A3F9817, 0xA6959889,
541       0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6,
542       0xFBFF84DF, 0x37558441, 0xB9DA83A2, 0x7570833C,
543       0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239,
544       0xD7718B20, 0x1BDB8BBE, 0x95548C5D, 0x59FE8CC3,
545       0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C,
546       0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776,
547       0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C, 0xA10FB312,
548       0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8,
549       0xFC65AF44, 0x30CFAFDA, 0xBE40A839, 0x72EAA8A7,
550       0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D,
551       0xAA4DE78C, 0x66E7E712, 0xE868E0F1, 0x24C2E06F,
552       0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95,
553       0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, 0xF727FBDA,
554       0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE, 0x736DF520,
555       0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144,
556       0x52BCD85D, 0x9E16D8C3, 0x1099DF20, 0xDC33DFBE,
557       0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1,
558       0x8159C3E8, 0x4DF3C376, 0xC37CC495, 0x0FD6C40B,
559       0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4,
560       0xFEEC49CD, 0x32464953, 0xBCC94EB0, 0x70634E2E,
561       0xA9435C82, 0x65E95C1C, 0xEB665BFF, 0x27CC5B61,
562       0x2D095278, 0xE1A352E6, 0x6F2C5505, 0xA386559B,
563       0x061D761C, 0xCAB77682, 0x44387161, 0x889271FF,
564       0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05,
565       0xD5F86DA9, 0x19526D37, 0x97DD6AD4, 0x5B776A4A,
566       0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0,
567       0x83D02561, 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282,
568       0x079A2B9B, 0xCB302B05, 0x45BF2CE6, 0x89152C78,
569       0x50353ED4, 0x9C9F3E4A, 0x121039A9, 0xDEBA3937,
570       0xD47F302E, 0x18D530B0, 0x965A3753, 0x5AF037CD,
571       0xFF6B144A, 0x33C114D4, 0xBD4E1337, 0x71E413A9,
572       0x7B211AB0, 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53,
573       0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C,
574       0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6
575     };
576     // @formatter:on
577 
578     /** The current CRC value, bit-flipped */
579     private int crc;
580 
581     /** Constructs a new PureJavaCrc32 object. */
582     public PureJavaCrc32() {
583         resetCrc();
584     }
585 
586     @Override
587     public long getValue() {
588         return ~crc & 0xffffffffL;
589     }
590 
591     @Override
592     public void reset() {
593         resetCrc();
594     }
595 
596     // called by ctor, so must not be overrideable
597     private void resetCrc() {
598         crc = 0xffffffff;
599     }
600 
601     @Override
602     public void update(final byte[] b, final int offset, final int len) {
603       int localCrc = crc;
604       final int remainder = len & 0x7;
605       int i = offset;
606       for (final int end = offset + len - remainder; i < end; i += 8) {
607         final int x = localCrc ^
608             (b[i] << 24 >>> 24) + (b[i + 1] << 24 >>> 16) +
609             (b[i + 2] << 24 >>> 8) + (b[i + 3] << 24);
610 
611         localCrc = T[(x << 24 >>> 24) + 0x700] ^ T[(x << 16 >>> 24) + 0x600] ^
612                    T[(x <<  8 >>> 24) + 0x500] ^ T[ (x      >>> 24) + 0x400] ^
613                    T[(b[i + 4] << 24 >>> 24) + 0x300] ^ T[(b[i + 5] << 24 >>> 24) + 0x200] ^
614                    T[(b[i + 6] << 24 >>> 24) + 0x100] ^ T[b[i + 7] << 24 >>> 24];
615       }
616       // loop unroll - duff's device style
617       switch (remainder) {
618       case 7:
619           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
620           // falls-through
621       case 6:
622           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
623           // falls-through
624       case 5:
625           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
626           // falls-through
627       case 4:
628           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
629           // falls-through
630       case 3:
631           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
632           // falls-through
633       case 2:
634           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
635           // falls-through
636       case 1:
637           localCrc = localCrc >>> 8 ^ T[(localCrc ^ b[i++]) << 24 >>> 24];
638           // falls-through
639       }
640       // Publish crc out to object
641       crc = localCrc;
642     }
643 
644     @Override
645     public final void update(final int b) {
646         crc = crc >>> 8 ^ T[(crc ^ b) << 24 >>> 24];
647     }
648 
649 }