1/////////////////////////////////////////////////////////////////////////////// 2// 3/// \file crc64_small.c 4/// \brief CRC64 calculation (size-optimized) 5// 6// Author: Lasse Collin 7// 8// This file has been put into the public domain. 9// You can do whatever you want with this file. 10// 11/////////////////////////////////////////////////////////////////////////////// 12 13#include "check.h" 14 15 16static uint64_t crc64_table[256]; 17 18 19static void 20crc64_init(void) 21{ 22 static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); 23 24 for (size_t b = 0; b < 256; ++b) { 25 uint64_t r = b; 26 for (size_t i = 0; i < 8; ++i) { 27 if (r & 1) 28 r = (r >> 1) ^ poly64; 29 else 30 r >>= 1; 31 } 32 33 crc64_table[b] = r; 34 } 35 36 return; 37} 38 39 40extern LZMA_API(uint64_t) 41lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc) 42{ 43 mythread_once(crc64_init); 44 45 crc = ~crc; 46 47 while (size != 0) { 48 crc = crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); 49 --size; 50 } 51 52 return ~crc; 53} 54