aboutsummaryrefslogtreecommitdiff
path: root/src/org/tukaani/xz/check/CRC64.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/tukaani/xz/check/CRC64.java')
-rw-r--r--src/org/tukaani/xz/check/CRC64.java49
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;