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 *      https://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 *
025 * <p>
026 * This is to avoid the JNI overhead for certain uses of checksumming
027 * where many small pieces of data are checksummed in succession.
028 * </p>
029 * <p>
030 * The current version is ~10x to 1.8x as fast as Sun's native
031 * java.util.zip.CRC32 in Java 1.6
032 * </p>
033 * <p>
034 * Copied from Apache Hadoop 2.6.3.
035 * The code agrees with the following file in the 2.6.3 tag:
036 * https://gitbox.apache.org/repos/asf?p=hadoop.git;a=blob_plain;
037 * f=hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/PureJavaCrc32.java;
038 * hb=2120de588b92b9f22b1cc4188761d6a8c61aa778
039 * </p>
040 * <p>
041 * This class is Not ThreadSafe
042 * </p>
043 *
044 * @see java.util.zip.CRC32
045 * @since 1.11
046 */
047public class PureJavaCrc32 implements Checksum {
048
049    /**
050     * CRC-32 lookup tables generated by the polynomial 0xEDB88320.
051     * See also TestPureJavaCrc32.Table.
052     */
053    // @formatter:off
054    private static final int[] T = {
055      /* T8_0 */
056      0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
057      0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
058      0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
059      0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
060      0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
061      0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
062      0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
063      0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
064      0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
065      0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
066      0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
067      0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
068      0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
069      0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
070      0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
071      0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
072      0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
073      0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
074      0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
075      0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
076      0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
077      0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
078      0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
079      0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
080      0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
081      0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
082      0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
083      0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
084      0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
085      0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
086      0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
087      0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
088      0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
089      0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
090      0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
091      0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
092      0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
093      0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
094      0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
095      0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
096      0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
097      0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
098      0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
099      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}