1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
// the precomputed values for all possible byte values
private static long[] CRC64Table = new long[256];
// precompute the CRC-64 table for one byte
static {
// x64 + x4 + x3 + x1 + 1
long POLY64 = 0x000000000000001BL;
long POLY64Reverse = 0xd800000000000000L;
long reminder;
for(int i=0;i<256;i++) {
reminder = i;
for (int j=0;j<8;j++) {
if ((reminder & 1) !=0)
reminder = (reminder >>> 1) ^ POLY64Reverse;
else
reminder = reminder >>> 1;
}
CRC64Table[i] = reminder;
}
}
public static long crc64_fast(char[] sequence) {
long crc = 0;
for(int i=0;i<sequence.length;i++) {
int index = (int) ((crc ^ sequence[i]) & 0xff);
crc = CRC64Table[index] ^ (crc >>> 8);
}
return crc;
}
public static void main(String[] args) {
long crc = 0;
String s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
crc = crc64_fast(s.toCharArray());
System.out.println(Long.toHexString(crc));
} |