是否使用SuperFash而不是CRC32?

是否使用SuperFash而不是CRC32?,c,hash,crc,C,Hash,Crc,注意:我不打算使用它,也不希望它给出与CRC32相同的输出值 我正在编写一个简单的压缩/解压缩例程,以提供非常快速的解压缩,并且在解压缩时没有内存开销。输入数据被分成4096字节长的块,并按顺序压缩 我的问题:我想为每个压缩块添加一些错误检测(块大小>8) ^crc32_查找_表[(crc32_寄存器&0x000000FF)^*数据++]; } 返回crc32_寄存器^0xFFFFFFFF; } 我的问题是: 我可以使用散列而不是循环冗余校验值来在压缩数据块中执行错误检测吗?据我所知(我记得在

注意:我不打算使用它,也不希望它给出与CRC32相同的输出值

我正在编写一个简单的压缩/解压缩例程,以提供非常快速的解压缩,并且在解压缩时没有内存开销。输入数据被分成4096字节长的块,并按顺序压缩

我的问题:我想为每个压缩块添加一些错误检测(块大小>8) ^crc32_查找_表[(crc32_寄存器&0x000000FF)^*数据++]; } 返回crc32_寄存器^0xFFFFFFFF; } 我的问题是:

我可以使用散列而不是循环冗余校验值来在压缩数据块中执行错误检测吗?据我所知(我记得在我的电子课程中),CRC算法被设计成 当数据在嘈杂的信道上传输时发生突发错误时,效率非常高,而从硬盘读取的数据则不是这种情况。如果我错了,请纠正我


谢谢你的建议

散列的设计目的是,即使对输入进行非常小的更改,结果也会发生很大的变化

我认为超级灰烬具有这种性质。它可能更容易受到冲突的影响(因为社区对它的分析似乎较少),但它不应该阻止您所想到的使用


祝你好运:)

超级哈希被发现有一些问题,还有其他快速哈希函数2。如果你想找一些适合大数据块、低冲突的东西,你可以试试谷歌city hash的128位变体(http://code.google.com/p/cityhash/ )或者说3。还有一些像crap8和crapwow这样的非常规函数,它们声称提供了几乎完美的位雪崩和漏斗,因此几乎没有冲突,您可以在这里阅读它和其他非crypto散列函数:

因为您的问题不在于安全性,所以您可以使用“损坏的”加密散列函数,它们不能抵御有感知的攻击者,但仍然非常擅长检测传输错误。我在想,在某些平台上,它被测量为比CRC32更快。你可能还想去查查塔顿和巴拿马;有关各种加密哈希函数的C和Java开源实现,请参阅


如果您的目标体系结构是一个最近/足够大的x86 CPU,它具有指令功能,那么您可以通过使用分组密码AES和常规密钥(例如,全零密钥)简单地计算a来生成速度极快且非常好的校验和;由于这不是为了安全,您甚至可以使用比标准AES更少的轮数(例如,5轮而不是标准的10轮)。

如果您只是为了防止压缩文件意外损坏,并检查解压缩数据的校验和,则任何奇数校验和方法都可能工作良好,因为压缩数据中的任何错误都会破坏它后面的所有内容。也许除了简单的模和或异或之外,但即使是像Adler32这样的东西也应该做这项工作。谢谢!我也有同样的想法,但是当出现错误数据时,将错误检测步骤放在解压之后需要解压例程进行非常好的错误处理。所谓错误,是指在处理压缩块中的无效LZ pos/len时可能发生的内存下溢/溢出。如果我能在解压例程的主循环中去掉边界测试,我就可以轻松地提高15%的速度……出于安全原因,在任何情况下,您都需要处理内存溢出。否则,攻击者很容易创建使您的程序崩溃(或可能破坏)的输入,而合法压缩器为压缩数据生成的任何校验和也可能被手工制作攻击包的人模仿(因为社区似乎较少对其进行分析)如果Superfashash声称是一个加密散列函数,那么它是有意义的。它不是。没有必要对它进行分析,就像任何非加密散列函数一样,构建冲突是微不足道的。我喜欢Bob Jenkins的散列,因为它们有大量统计测试的证据,表明它们是经过仔细选择的或者输入中翻转不同位的结果具有良好的扩散性和独立性。据我所知,Superfashash可能已经完成了类似的测试程序,但从其网站上看,情况并非如此。@Pascal:我说的这句话的意思是,在该散列函数中,碰撞概率没有很好地确定。我我明白OP只是想要CRC-hash来确保他在解压时得到原始数据。冲突可能也是一个问题,否则一个简单的奇偶校验就足够了。很抱歉我的反应太晚了!我终于使用了Adler16,一个著名的Adler32算法的修改版本。谢谢你的好参考! | Operation | Time (GCC4.4.5/Linux) | Time (MSVC2010/Win7) | |-------------------------------+--------------------------+------------------------| | Decompression | 6.8 seconds | 6.95 seconds | | CRC32 on decompressed result | 4.9 seconds | 4.62 seconds | | CRC32 on compressed result | 2.8 seconds | 2.69 seconds | | Operation | Time (GCC4.4.5/Linux) | Time (MSVC2010/Win7) | |-------------------------------+--------------------------+------------------------| | SFH on decompressed result | 1.1 seconds | 1.33 seconds | | SFH on compressed result | 0.7 seconds | 0.75 seconds |
# include <stdint.h>

// CRC32 lookup table (corresponding to the polynom 0x04C11DB7)
static const uint32_t  crc32_lookup_table[256] =
{
    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
    // many lines skipped
    // ...
    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
} ;

uint32_t crc32_hash(const uint8_t * data, size_t len)
{
    uint32_t crc32_register = 0xFFFFFFFF ;
    while( len-- )
    {
        crc32_register = (crc32_register >> 8)
                       ^ crc32_lookup_table[(crc32_register & 0x000000FF) ^ *data++] ;
    }
    return crc32_register ^ 0xFFFFFFFF ;
}