2012-03-06 58 views
1

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

我目前想到的是以下几点:

#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总和相当的数据完整性检查。

回答

0

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

有两个级别,你会把大块放在树的第一层(底部)。树的第二级是通过连接来自较低级的校验和而创建的字节阵列。

这适用于任何散列函数。

+0

那么,这对读取和写入的不同大小块又不太好用,因为如果块的大小与树的较低级别上的散列块的大小不一致,我们将不得不等待块的所有块到达。 – begemotv2718 2012-03-06 13:00:48

0

难道你不能只计算连接的偏移量,长度和每个块的内容的SHA1总和,然后与这些连在一起?

+0

不,可能我没有说清楚,但读取的块与写入块不同(它们具有不同的大小),所以不幸的是您的解决方案无法工作。 – begemotv2718 2012-03-06 12:45:40