Authors: Jake Morrison (jake@cogini.com).
References
Implement the Avro CRC 64 fingerprint algorithm.
The algorithm is defined with this Java code:
static long fingerprint64(byte[] buf) {
if (FP_TABLE == null) initFPTable();
long fp = EMPTY;
for (int i = 0; i < buf.length; i++)
fp = (fp >>> 8) ^ FP_TABLE[(int)(fp ^ buf[i]) & 0xff];
return fp;
}
static long EMPTY = 0xc15d213aa4d7a795L;
static long[] FP_TABLE = null;
static void initFPTable() {
FP_TABLE = new long[256];
for (int i = 0; i < 256; i++) {
long fp = i;
for (int j = 0; j < 8; j++)
fp = (fp >>> 1) ^ (EMPTY & -(fp & 1L));
FP_TABLE[i] = fp;
// Generate the lookup table used in this code
System.out.format("fp_table(%d) -> 16#%s;%n", i, Long.toHexString(fp));
}
}
In the Avro Java SchemaNormalization code, they serialize the fingerprint
in little-endian format.
crc64() = non_neg_integer()
| crc64/1 |
crc64(Data::binary()) -> crc64()
Generated by EDoc