2012-03-06 143 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

相關問題