【问题标题】:Best way to *invalidate* a checksum*使校验和无效的最佳方法
【发布时间】:2011-09-13 14:04:02
【问题描述】:

假设我有一个 4KB 的缓冲区,一开始就包含一个校验和。此缓冲区包含引用其他缓冲区的元数据。注:缓冲区是内存映射文件。我注意到其中一个缓冲区无效(校验和不起作用或校验和很好,但它引用了无效的缓冲区)。现在,我想使引用另一个无效缓冲区的缓冲区无效。使缓冲区无效的数学上最好的方法是什么?损坏校验和本身,使其可能与数据不匹配或损坏数据,使其可能与校验和不匹配。还是有第三种更好的方法?无论如何,这是一个 CRC32 变体。

【问题讨论】:

    标签: checksum invalidation crc32


    【解决方案1】:

    假设您的引用缓冲区的 CRC 是有效的,您只需从中减去一个,这将使您的缓冲区无效。根据您的描述,这似乎是这种情况,因为您声明 referenced 缓冲区是其 CRC 可能错误的缓冲区。

    如果引用的 CRC32 无效,最安全的办法是计算 CRC然后减一。您首先需要知道正确的 CRC,因为随机选择的 CRC,虽然不太可能是正确的,但仍然有大约四分之一的机会是正确的。

    在这里更改 CRC 似乎是最安全的选择。由于没有对 CRC32 算法进行数学分析,因此无法保证对数据的特定更改不会生成 相同 CRC 值(因为大量数据集可能映射到相同的 CRC)。

    但是,特定数据集肯定会始终生成相同的 CRC,因此,通过将 CRC 更改为其他内容,您可以确定该块现在将无效。 p>

    【讨论】:

    • CRC32 算法保证在 32 个连续位的单次运行中更改任何位组合将产生不同的 CRC。事实上,一个人可以选择任何 32 个连续的位,一个人可能执行的 2^32 个不同的位翻转组合将产生所有 2^32 个不同的 CRC 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2014-11-28
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多