|
@@ -56,22 +56,38 @@ public class PureJavaCrc32C implements Checksum {
|
|
@Override
|
|
@Override
|
|
public void update(byte[] b, int off, int len) {
|
|
public void update(byte[] b, int off, int len) {
|
|
int localCrc = crc;
|
|
int localCrc = crc;
|
|
|
|
+
|
|
while(len > 7) {
|
|
while(len > 7) {
|
|
- int c0 = b[off++] ^ localCrc;
|
|
|
|
- int c1 = b[off++] ^ (localCrc >>>= 8);
|
|
|
|
- int c2 = b[off++] ^ (localCrc >>>= 8);
|
|
|
|
- int c3 = b[off++] ^ (localCrc >>>= 8);
|
|
|
|
- localCrc = (T8_7[c0 & 0xff] ^ T8_6[c1 & 0xff])
|
|
|
|
- ^ (T8_5[c2 & 0xff] ^ T8_4[c3 & 0xff]);
|
|
|
|
|
|
+ final int c0 =(b[off+0] ^ localCrc) & 0xff;
|
|
|
|
+ final int c1 =(b[off+1] ^ (localCrc >>>= 8)) & 0xff;
|
|
|
|
+ final int c2 =(b[off+2] ^ (localCrc >>>= 8)) & 0xff;
|
|
|
|
+ final int c3 =(b[off+3] ^ (localCrc >>>= 8)) & 0xff;
|
|
|
|
+ localCrc = (T[T8_7_start + c0] ^ T[T8_6_start + c1])
|
|
|
|
+ ^ (T[T8_5_start + c2] ^ T[T8_4_start + c3]);
|
|
|
|
+
|
|
|
|
+ final int c4 = b[off+4] & 0xff;
|
|
|
|
+ final int c5 = b[off+5] & 0xff;
|
|
|
|
+ final int c6 = b[off+6] & 0xff;
|
|
|
|
+ final int c7 = b[off+7] & 0xff;
|
|
|
|
|
|
- localCrc ^= (T8_3[b[off++] & 0xff] ^ T8_2[b[off++] & 0xff])
|
|
|
|
- ^ (T8_1[b[off++] & 0xff] ^ T8_0[b[off++] & 0xff]);
|
|
|
|
|
|
+ localCrc ^= (T[T8_3_start + c4] ^ T[T8_2_start + c5])
|
|
|
|
+ ^ (T[T8_1_start + c6] ^ T[T8_0_start + c7]);
|
|
|
|
|
|
|
|
+ off += 8;
|
|
len -= 8;
|
|
len -= 8;
|
|
}
|
|
}
|
|
- while(len > 0) {
|
|
|
|
- localCrc = (localCrc >>> 8) ^ T8_0[(localCrc ^ b[off++]) & 0xff];
|
|
|
|
- len--;
|
|
|
|
|
|
+
|
|
|
|
+ /* loop unroll - duff's device style */
|
|
|
|
+ switch(len) {
|
|
|
|
+ case 7: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 6: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 5: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 4: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 3: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 2: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ case 1: localCrc = (localCrc >>> 8) ^ T[T8_0_start + ((localCrc ^ b[off++]) & 0xff)];
|
|
|
|
+ default:
|
|
|
|
+ /* nothing */
|
|
}
|
|
}
|
|
|
|
|
|
// Publish crc out to object
|
|
// Publish crc out to object
|
|
@@ -80,14 +96,24 @@ public class PureJavaCrc32C implements Checksum {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
final public void update(int b) {
|
|
final public void update(int b) {
|
|
- crc = (crc >>> 8) ^ T8_0[(crc ^ b) & 0xff];
|
|
|
|
|
|
+ crc = (crc >>> 8) ^ T[T8_0_start + ((crc ^ b) & 0xff)];
|
|
}
|
|
}
|
|
|
|
|
|
// CRC polynomial tables generated by:
|
|
// CRC polynomial tables generated by:
|
|
// java -cp build/test/classes/:build/classes/ \
|
|
// java -cp build/test/classes/:build/classes/ \
|
|
// org.apache.hadoop.util.TestPureJavaCrc32\$Table 82F63B78
|
|
// org.apache.hadoop.util.TestPureJavaCrc32\$Table 82F63B78
|
|
|
|
|
|
- static final int[] T8_0 = new int[] {
|
|
|
|
|
|
+ private static final int T8_0_start = 0*256;
|
|
|
|
+ private static final int T8_1_start = 1*256;
|
|
|
|
+ private static final int T8_2_start = 2*256;
|
|
|
|
+ private static final int T8_3_start = 3*256;
|
|
|
|
+ private static final int T8_4_start = 4*256;
|
|
|
|
+ private static final int T8_5_start = 5*256;
|
|
|
|
+ private static final int T8_6_start = 6*256;
|
|
|
|
+ private static final int T8_7_start = 7*256;
|
|
|
|
+
|
|
|
|
+ private static final int[] T = new int[] {
|
|
|
|
+ /* T8_0 */
|
|
0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
|
|
0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
|
|
0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
|
|
0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
|
|
0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
|
|
0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
|
|
@@ -151,9 +177,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
|
|
0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
|
|
0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
|
|
0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
|
|
0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
|
|
0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
|
|
- 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
|
|
|
|
- };
|
|
|
|
- static final int[] T8_1 = new int[] {
|
|
|
|
|
|
+ 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
|
|
|
|
+ /* T8_1 */
|
|
0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899,
|
|
0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899,
|
|
0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945,
|
|
0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945,
|
|
0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21,
|
|
0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21,
|
|
@@ -217,9 +242,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7,
|
|
0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7,
|
|
0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B,
|
|
0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B,
|
|
0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F,
|
|
0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F,
|
|
- 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483
|
|
|
|
- };
|
|
|
|
- static final int[] T8_2 = new int[] {
|
|
|
|
|
|
+ 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483,
|
|
|
|
+ /* T8_2 */
|
|
0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073,
|
|
0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073,
|
|
0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469,
|
|
0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469,
|
|
0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6,
|
|
0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6,
|
|
@@ -283,9 +307,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177,
|
|
0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177,
|
|
0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D,
|
|
0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D,
|
|
0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2,
|
|
0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2,
|
|
- 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8
|
|
|
|
- };
|
|
|
|
- static final int[] T8_3 = new int[] {
|
|
|
|
|
|
+ 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8,
|
|
|
|
+ /* T8_3 */
|
|
0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939,
|
|
0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939,
|
|
0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA,
|
|
0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA,
|
|
0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF,
|
|
0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF,
|
|
@@ -349,9 +372,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57,
|
|
0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57,
|
|
0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4,
|
|
0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4,
|
|
0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1,
|
|
0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1,
|
|
- 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842
|
|
|
|
- };
|
|
|
|
- static final int[] T8_4 = new int[] {
|
|
|
|
|
|
+ 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842,
|
|
|
|
+ /* T8_4 */
|
|
0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4,
|
|
0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4,
|
|
0xE045BEB0, 0xD854D11C, 0x906761E8, 0xA8760E44,
|
|
0xE045BEB0, 0xD854D11C, 0x906761E8, 0xA8760E44,
|
|
0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65,
|
|
0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65,
|
|
@@ -415,9 +437,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82,
|
|
0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82,
|
|
0x2D3CD5C6, 0x152DBA6A, 0x5D1E0A9E, 0x650F6532,
|
|
0x2D3CD5C6, 0x152DBA6A, 0x5D1E0A9E, 0x650F6532,
|
|
0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013,
|
|
0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013,
|
|
- 0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3
|
|
|
|
- };
|
|
|
|
- static final int[] T8_5 = new int[] {
|
|
|
|
|
|
+ 0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3,
|
|
|
|
+ /* T8_5 */
|
|
0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA,
|
|
0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA,
|
|
0xB2F53777, 0x5DC55C6E, 0x697997B4, 0x8649FCAD,
|
|
0xB2F53777, 0x5DC55C6E, 0x697997B4, 0x8649FCAD,
|
|
0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5,
|
|
0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5,
|
|
@@ -481,9 +502,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154,
|
|
0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154,
|
|
0xE501FDF9, 0x0A3196E0, 0x3E8D5D3A, 0xD1BD3623,
|
|
0xE501FDF9, 0x0A3196E0, 0x3E8D5D3A, 0xD1BD3623,
|
|
0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B,
|
|
0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B,
|
|
- 0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C
|
|
|
|
- };
|
|
|
|
- static final int[] T8_6 = new int[] {
|
|
|
|
|
|
+ 0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C,
|
|
|
|
+ /* T8_6 */
|
|
0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558,
|
|
0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558,
|
|
0xA5E0C5D1, 0xCDE3E919, 0x75E69C41, 0x1DE5B089,
|
|
0xA5E0C5D1, 0xCDE3E919, 0x75E69C41, 0x1DE5B089,
|
|
0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B,
|
|
0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B,
|
|
@@ -547,9 +567,8 @@ public class PureJavaCrc32C implements Checksum {
|
|
0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD,
|
|
0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD,
|
|
0x8B39B544, 0xE33A998C, 0x5B3FECD4, 0x333CC01C,
|
|
0x8B39B544, 0xE33A998C, 0x5B3FECD4, 0x333CC01C,
|
|
0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E,
|
|
0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E,
|
|
- 0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F
|
|
|
|
- };
|
|
|
|
- static final int[] T8_7 = new int[] {
|
|
|
|
|
|
+ 0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F,
|
|
|
|
+ /* T8_7 */
|
|
0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769,
|
|
0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769,
|
|
0x211D826D, 0x6821FF4A, 0xB3657823, 0xFA590504,
|
|
0x211D826D, 0x6821FF4A, 0xB3657823, 0xFA590504,
|
|
0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3,
|
|
0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3,
|
|
@@ -613,6 +632,6 @@ public class PureJavaCrc32C implements Checksum {
|
|
0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612,
|
|
0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612,
|
|
0x866AB316, 0xCF56CE31, 0x14124958, 0x5D2E347F,
|
|
0x866AB316, 0xCF56CE31, 0x14124958, 0x5D2E347F,
|
|
0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8,
|
|
0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8,
|
|
- 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5
|
|
|
|
|
|
+ 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5
|
|
};
|
|
};
|
|
}
|
|
}
|