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