首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改CRC64 64的哈希表以生成65536而不是256个值。

修改CRC64 64的哈希表以生成65536而不是256个值。
EN

Stack Overflow用户
提问于 2019-07-20 08:06:57
回答 2查看 238关注 0票数 1

简单地将循环中的256个修改为65536,只会一次又一次地重复相同的256个值。如何生成65536个不同的值?

代码语言:javascript
复制
#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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-20 11:33:24

如果您想要65536个值,那么大概您想要一个16位表,所以也要将位循环升级到16。

代码语言:javascript
复制
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;
    }
}

不能保证这将产生一个有用的表,但所有的值都应该是不同的-至少。

票数 0
EN

Stack Overflow用户

发布于 2019-07-20 21:49:51

如果生成的CRC应该匹配小端点处理器(如X86 )上的位或面向字节的CRC,则需要交换每个2字节== 16位对的上/下字节。示例代码,不确定是否可以清除。请注意,generate函数中的len是== #2字节元素== # 16位元素。

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57122893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档