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