修改CRC64';s哈希表生成65536而不是256个值
只需将循环中的256修改为65536,即可反复重复相同的256值。如何生成65536个不同的值修改CRC64';s哈希表生成65536而不是256个值,c,hash,cryptography,crc,C,Hash,Cryptography,Crc,只需将循环中的256修改为65536,即可反复重复相同的256值。如何生成65536个不同的值 #define CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL static uint64_t crc64_table[256] = {0}; static void generate_crc64_table(void) { uint64_t i, j, c, crc; for (i = 0; i < 256; i++) {
#define CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
static uint64_t crc64_table[256] = {0};
static void generate_crc64_table(void)
{
uint64_t i, j, c, crc;
for (i = 0; i < 256; i++) {
crc = 0;
c = i << 56;
for (j = 0; j < 8; j++) {
if ((crc ^ c) & 0x8000000000000000ULL)
crc = (crc << 1) ^ CRC64_ECMA182_POLY;
else
crc <<= 1;
c <<= 1;
}
crc64_table[i] = crc;
}
}
#定义CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
静态uint64_t crc64_表[256]={0};
静态void生成\u crc64\u表(void)
{
uint64_t i,j,c,crc;
对于(i=0;i<256;i++){
crc=0;
c=i如果您想要65536个值,那么您可能想要一个16位的表,因此也将位循环升级到16位
static void generate_crc64_table(void)
{
uint64_t i, j, c, crc;
for (i = 0; i < 65536 ; i++) { // 65536 was 256
crc = 0;
c = i << 32; // 32 was 56
for (j = 0; j < 16; j++) { // 16 was 8
if ((crc ^ c) & 0x8000000000000000ULL)
crc = (crc << 1) ^ CRC64_ECMA182_POLY;
else
crc <<= 1;
c <<= 1;
}
crc64_table[i] = crc;
}
}
static void生成表格(void)
{
uint64_t i,j,c,crc;
对于(i=0;i<65536;i++){//65536为256
crc=0;
c=i如果您想要65536个值,那么您可能想要一个16位的表,因此也将位循环升级到16位
static void generate_crc64_table(void)
{
uint64_t i, j, c, crc;
for (i = 0; i < 65536 ; i++) { // 65536 was 256
crc = 0;
c = i << 32; // 32 was 56
for (j = 0; j < 16; j++) { // 16 was 8
if ((crc ^ c) & 0x8000000000000000ULL)
crc = (crc << 1) ^ CRC64_ECMA182_POLY;
else
crc <<= 1;
c <<= 1;
}
crc64_table[i] = crc;
}
}
static void生成表格(void)
{
uint64_t i,j,c,crc;
对于(i=0;i<65536;i++){//65536为256
crc=0;
c=i如果生成的CRC应该与小端处理器(如X86)上的位或面向字节的CRC匹配,则需要交换每个2字节==16位对的上/下字节。示例代码,不确定是否可以清除。请注意,generate函数中的len是#shorts==#2字节元素==#16位元素
#define CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
static uint64_t crc64_table[65536] = {0};
static void generate_crc64_table(void)
{
uint64_t i, j, crc;
for (i = 0; i < 65536; i++) {
crc = i << 48;
for (j = 0; j < 16; j++)
// assumes two's complement math
crc = (crc << 1) ^ ((0ull-(crc>>63))&CRC64_ECMA182_POLY);
// swap byte pairs on index and values for table lookup
crc64_table[((i & 0xff00) >> 8) | ((i & 0x00ff) << 8)] =
((crc & 0xff00ff00ff00ff00ull) >> 8) | ((crc & 0x00ff00ff00ff00ffull) << 8);
}
}
static uint64_t generate_crc64(uint16_t *bfr, int len)
{
uint64_t crc = 0;
int i;
for (i = 0; i < len; i++)
// generates crc with byte pairs swapped
crc = crc64_table[(crc>>48) ^ *bfr++] ^ (crc << 16);
// unswap byte pairs for return
return ((crc & 0xff00ff00ff00ff00) >> 8) | ((crc & 0x00ff00ff00ff00ff) << 8);
}
#定义CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
静态uint64_t crc64_表[65536]={0};
静态void生成\u crc64\u表(void)
{
uint64_t i,j,crc;
对于(i=0;i<65536;i++){
crc=i如果生成的crc应该与小端处理器(如X86)上的位或面向字节的crc匹配,则需要交换每个2字节==16位对的上/下字节。示例代码,不确定是否可以清除。请注意,generate函数中的len是#shorts==#2字节元素==#16位元素
#define CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
static uint64_t crc64_table[65536] = {0};
static void generate_crc64_table(void)
{
uint64_t i, j, crc;
for (i = 0; i < 65536; i++) {
crc = i << 48;
for (j = 0; j < 16; j++)
// assumes two's complement math
crc = (crc << 1) ^ ((0ull-(crc>>63))&CRC64_ECMA182_POLY);
// swap byte pairs on index and values for table lookup
crc64_table[((i & 0xff00) >> 8) | ((i & 0x00ff) << 8)] =
((crc & 0xff00ff00ff00ff00ull) >> 8) | ((crc & 0x00ff00ff00ff00ffull) << 8);
}
}
static uint64_t generate_crc64(uint16_t *bfr, int len)
{
uint64_t crc = 0;
int i;
for (i = 0; i < len; i++)
// generates crc with byte pairs swapped
crc = crc64_table[(crc>>48) ^ *bfr++] ^ (crc << 16);
// unswap byte pairs for return
return ((crc & 0xff00ff00ff00ff00) >> 8) | ((crc & 0x00ff00ff00ff00ff) << 8);
}
#定义CRC64_ECMA182_POLY 0x42F0E1EBA9EA3693ULL
静态uint64_t crc64_表[65536]={0};
静态void生成\u crc64\u表(void)
{
uint64_t i,j,crc;
对于(i=0;i<65536;i++){
crc=i您还需要将crc64_表[256]
更新为crc64_表[65536]
…更不用说c=i您还需要将crc64_表[256]
更新为crc64_表[65536]
…更不用说c=i将32修改为48,它将生成所有唯一的数字。(我选中了。)谢谢!@Keisuke-如果处理器是little endian,你需要进行补偿。将32修改为48,它将生成所有唯一的数字。(我检查过。)谢谢!@Keisuke-如果处理器是little endian,你需要进行补偿。