001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.codec.digest;
018
019import java.util.zip.Checksum;
020
021/**
022 * A pure-Java implementation of the CRC32 checksum that uses
023 * the same polynomial as the built-in native CRC32.
024 * <p>
025 * This is to avoid the JNI overhead for certain uses of checksumming
026 * where many small pieces of data are checksummed in succession.
027 * </p>
028 * <p>
029 * The current version is ~10x to 1.8x as fast as Sun's native
030 * java.util.zip.CRC32 in Java 1.6
031 * </p>
032 * <p>
033 * Copied from Apache Hadoop 2.6.3.
034 * The code agrees with the following file in the 2.6.3 tag:
035 * https://gitbox.apache.org/repos/asf?p=hadoop.git;a=blob_plain;
036 * f=hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/PureJavaCrc32.java;
037 * hb=2120de588b92b9f22b1cc4188761d6a8c61aa778
038 * </p>
039 * <p>
040 * This class is Not ThreadSafe
041 * </p>
042 *
043 * @see java.util.zip.CRC32
044 * @since 1.11
045 */
046public class PureJavaCrc32 implements Checksum {
047
048    /**
049     * CRC-32 lookup tables generated by the polynomial 0xEDB88320.
050     * See also TestPureJavaCrc32.Table.
051     */
052    // @formatter:off
053    private static final int[] T = {
054      /* T8_0 */
055      0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
056      0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
057      0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
058      0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
059      0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
060      0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
061      0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
062      0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
063      0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
064      0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
065      0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
066      0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
067      0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
068      0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
069      0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
070      0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
071      0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
072      0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
073      0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
074      0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
075      0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
076      0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
077      0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
078      0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
079      0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
080      0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
081      0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
082      0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
083      0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
084      0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
085      0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
086      0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
087      0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
088      0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
089      0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
090      0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
091      0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
092      0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
093      0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
094      0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
095      0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
096      0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
097      0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
098      0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
099      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}