diff options
Diffstat (limited to 'src/org/tukaani/xz/check/CRC64.java')
-rw-r--r-- | src/org/tukaani/xz/check/CRC64.java | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/org/tukaani/xz/check/CRC64.java b/src/org/tukaani/xz/check/CRC64.java index 02b15b7..a590a25 100644 --- a/src/org/tukaani/xz/check/CRC64.java +++ b/src/org/tukaani/xz/check/CRC64.java @@ -1,7 +1,8 @@ /* * CRC64 * - * Author: Lasse Collin <lasse.collin@tukaani.org> + * Authors: Brett Okken <brett.okken.os@gmail.com> + * Lasse Collin <lasse.collin@tukaani.org> * * This file has been put into the public domain. * You can do whatever you want with this file. @@ -10,37 +11,53 @@ package org.tukaani.xz.check; public class CRC64 extends Check { - private static final long poly = 0xC96C5795D7870F42L; - private static final long[] crcTable = new long[256]; - - private long crc = -1; + private static final long[][] TABLE = new long[4][256]; static { - for (int b = 0; b < crcTable.length; ++b) { - long r = b; + final long poly64 = 0xC96C5795D7870F42L; + + for (int s = 0; s < 4; ++s) { + for (int b = 0; b < 256; ++b) { + long r = s == 0 ? b : TABLE[s - 1][b]; for (int i = 0; i < 8; ++i) { - if ((r & 1) == 1) - r = (r >>> 1) ^ poly; - else - r >>>= 1; + if ((r & 1) == 1) { + r = (r >>> 1) ^ poly64; + } else { + r >>>= 1; + } } - - crcTable[b] = r; + TABLE[s][b] = r; + } } } + private long crc = -1; + public CRC64() { size = 8; name = "CRC64"; } + @Override public void update(byte[] buf, int off, int len) { - int end = off + len; + final int end = off + len; + int i = off; + + for (int end4 = end - 3; i < end4; i += 4) { + final int tmp = (int)crc; + crc = TABLE[3][(tmp & 0xFF) ^ (buf[i] & 0xFF)] ^ + TABLE[2][((tmp >>> 8) & 0xFF) ^ (buf[i + 1] & 0xFF)] ^ + (crc >>> 32) ^ + TABLE[1][((tmp >>> 16) & 0xFF) ^ (buf[i + 2] & 0xFF)] ^ + TABLE[0][((tmp >>> 24) & 0xFF) ^ (buf[i + 3] & 0xFF)]; + } - while (off < end) - crc = crcTable[(buf[off++] ^ (int)crc) & 0xFF] ^ (crc >>> 8); + while (i < end) + crc = TABLE[0][(buf[i++] & 0xFF) ^ ((int)crc & 0xFF)] ^ + (crc >>> 8); } + @Override public byte[] finish() { long value = ~crc; crc = -1; |