MCPcopy Create free account
hub / github.com/bloomberg/comdb2 / crc32c

Function crc32c

tools/comdb2ar/chksum.cpp:4–53  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2#include "sb8.h"
3
4uint32_t crc32c(const uint8_t* buf, uint32_t sz)
5{
6 uint32_t crc = 0;
7 /* Process misaligned data byte at a time */
8 intptr_t misaligned = (intptr_t)buf & (sizeof(intptr_t) - 1);
9 unsigned adj = misaligned ? sizeof(intptr_t) - misaligned : 0;
10 if (adj > sz) adj = sz;
11 int i = 0;
12 switch (adj) {
13 case 7: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
14 case 6: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
15 case 5: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
16 case 4: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
17 case 3: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
18 case 2: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
19 case 1: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
20 sz -= adj;
21 buf += i;
22 }
23 /* Process 8 bytes at a time */
24 const uint8_t *end = buf + (sz & (~0x7));
25 while (buf < end) {
26 // read two little endian ints
27 uint32_t u32a, u32b;
28 u32a = (buf[0]<<0) | (buf[1]<<8) | (buf[2]<<16) | (buf[3]<<24);
29 buf += 4;
30 u32b = (buf[0]<<0) | (buf[1]<<8) | (buf[2]<<16) | (buf[3]<<24);
31 buf += 4;
32 crc ^= u32a;
33 uint32_t term1 = crc_tableil8_o88[crc & 0x000000FF] ^ crc_tableil8_o80[(crc >> 8) & 0x000000FF];
34 uint32_t term2 = crc >> 16;
35 crc = term1 ^ crc_tableil8_o72[term2 & 0x000000FF] ^ crc_tableil8_o64[(term2 >> 8) & 0x000000FF];
36 term1 = crc_tableil8_o56[u32b & 0x000000FF] ^ crc_tableil8_o48[(u32b >> 8) & 0x000000FF];
37 term2 = u32b >> 16;
38 crc = crc ^ term1 ^ crc_tableil8_o40[term2 & 0x000000FF] ^ crc_tableil8_o32[(term2 >> 8) & 0x000000FF];
39 }
40 /* Process the last 7 (or less) bytes */
41 sz &= 0x7;
42 i = 0;
43 switch (sz) {
44 case 7: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
45 case 6: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
46 case 5: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
47 case 4: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
48 case 3: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
49 case 2: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
50 case 1: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i;
51 }
52 return crc;
53}
54
55uint32_t __ham_func4(const uint8_t *k, uint32_t len)
56{

Callers 15

check_chksumFunction · 0.85
verify_checksumFunction · 0.85
berkdb_send_rtnFunction · 0.85
berkdb_receive_rtn_intFunction · 0.85
get_hostname_with_crc32Function · 0.85
form_tablelock_keynameFunction · 0.85
hash_fileidFunction · 0.85
__lock_ohashFunction · 0.85
check_chksumFunction · 0.85
__db_chksum_intFunction · 0.85
__db_check_chksum_algoFunction · 0.85
connect_threadFunction · 0.85

Calls

no outgoing calls

Tested by 1

gen_messageFunction · 0.68