c - 修改CRC64的哈希表生成65536个值而不是256个值

标签 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++) {
        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;
    }
}

最佳答案

如果你想要 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;
    }
}

不能保证这会产生一个有用的表格,但值至少应该是不同的。

关于c - 修改CRC64的哈希表生成65536个值而不是256个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57122893/

相关文章:

c# - .GetHashCode() 是否应该为内存中具有不同引用的两个对象返回相同的值?

c# - 数字签名如何保证消息已由 'Alice' 发送

java - iOS对称 key 加密/解密相当于Java

C- 错误预期标识符或 '(' token 之前的 '.'

c - 代码中&handler是什么意思?

c - 在 C 中键入强制地址

encryption - 为什么 crypto/rsa 库中的 Go 函数 EncryptOAEP 需要随机 io.Reader?

Code::Blocks 13.12 错误 - 程序已停止工作

ruby - 使用哈希默认值时出现奇怪的意外行为(消失/更改值),例如哈希.new([])

Ruby - 使用哈希返回数组中的重复项,这有效吗?