【问题标题】:parallelizable hash function for data integrity check用于数据完整性检查的可并行哈希函数
【发布时间】:2012-03-06 12:18:23
【问题描述】:

我需要在以下情况下检查数据完整性:数据以不同大小的块写入存储(对于每个块,我们知道它在最终文件中的偏移量)。但是,这些块以任意顺序和多个线程出现。它们以完全不同的顺序从存储中读回(并且块具有不同的大小)。

我目前的想法如下:

    #define MODEST_PRIME 1021
    unsigned char checkbuf[MODEST_PRIME];
    void check_function(unsigned char *chunk, size_t offset, size_t length, unsigned char *result)
    {
       size_t i;
       for(i=0; i<length; i++)
           result[(i+offset)%MODEST_PRIME]^=chunk[i];
    }

这似乎可以防止更改任何单个字节并且(在某种程度上)防止 块的交换(交换块之间的距离不太可能被大素数整除)。这个函数对不同块的结果可以只是异或在一起,所以它是完全可并行的。

但是,与 md5 sum 或任何其他现代哈希函数相比,此函数看起来非常简单。但据我了解,md5 sum 或 sha-1 sum 的计算不能以任意顺序完成。

好吧,问题是,我们有没有更好的解决方案

  1. 如果我们知道块的大小和偏移量(就像我上面概述的简单算法),可以按任意顺序计算。
  2. 可以提供至少与 md5 sum 相当的数据完整性检查。

【问题讨论】:

    标签: c parallel-processing checksum data-integrity


    【解决方案1】:

    一个选项是树状校验和层次结构。

    如果有两个级别,您可以将块放在树的第一个(底部)级别。树的第 2 层是一个字节数组,它是通过连接较低层的校验和而创建的。

    这适用于任何哈希函数。

    【讨论】:

    • 好吧,这对于不同大小的块在读取和写入时再次不起作用,因为如果块的大小与较低级别的哈希块的大小不一致树,我们将不得不等到该块的所有块都到达。
    【解决方案2】:

    你不能只计算每个块的连接偏移量、长度和内容的 SHA1 总和,然后再将它们异或吗?

    【讨论】:

    • 不,可能是我没有说清楚,但是读取的块与写入的块不同(它们的大小不同),所以很遗憾,您的解决方案将不起作用.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2017-11-23
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多