merkle tree 的基本概念:merkle tree 是由計算機科學家 ralph merkle 在很多年前提出的,並以他本人的名字來命名。不過,merkle tree 確實涉及到了很多有意思的實際應用。最近幾年才有的乙個例子是,位元幣錢包服務用 merkle tree 的機制來作」百分百準備金證明「 ( )。不過今天, merkle tree多出現在資料的「完整性校驗」。
要在檔案的基礎上構建merkletree,首先是對檔案進行分塊,然後對每個檔案分塊進行hash計算,得到各塊的hash value, 所有的hash value都為merkle tree的葉子節點,這些葉子節點兩兩成對(連線),再次hash計算,得到其父親節點,其父親節點也按照同樣的方法,得到它的父親節點,如此進行直到獲得根節點。
圖示:葉子節點數為4時,構造的merkletree
以下是本人用c編寫的構建檔案merkletree的基本思路:
1.開啟指定的檔案;
2.獲得檔案長度,按照每塊64bytes大小對檔案分塊,塊數n=len/64(這裡測試的檔案,其大小均能被64bytes整除,eg1kb)
3.定義資料結構path
typedef struct pathpath;
用於構建並儲存merkle tree,圖示
從底向上的建樹過程,第i層對應path[i],第i層的第j個節點對應path[i].node[j];其子節點為path[i-1].node[j*2],path[i-1].node[j*2+1];
父親節點是左右孩子節點的hashvalue連線後計算的hash值
測試**:
#include
#include
#include
typedef
struct pathpath;
unsigned
int sdbmhash(char *str)
return (hash & 0x7fffffff);
}int merkle_root(path path,int num)
/* for(k=0;k<8;k++)
printf("\n");
*/path[depth].node[i]=sdbmhash(temp);
i++;}}
printf("root=%x,%d\n",path[depth].node[0],path[depth].node[0]);
return depth;
} /*在檔案的基礎上建立mkt*/
int merkle_overfile(char * filename)
fseek(fp,0,seek_end);
if((len=ftell(fp))==-1l)
rewind(fp);
printf("len=%d\n",len);
n=len/64;
/*檔案按64bytes大小分塊,葉子節點初始化*/
path[0].node=(int *)malloc(n*sizeof(int));
i=0;
while(i1,64,fp);
path[0].node[i]=sdbmhash(buffer);
i++;
}fclose(fp);
depth=merkle_root(path,n);
return depth;
}//測試輸入檔案file_1k.txt
int main()
需要注意的地方:
windows下生成指定大小的檔案,進入命令視窗,輸入命令:
fsutil file createnew test.txt 104857600
則瞬間生成乙個100mb大小的檔案
其中104857600=100*1024*1024位元組(byte);
在c語言中用printf()函式列印字元型變數時,如果想採用」%x」的格式將字元型變數值以十六進製制形式列印出來,會出現乙個小問題
char buf[10] = ;
buf[0] = 0xbf;
printf("%2x\n\n\n", buf[0]); /*在終端將會顯示成:ffffffbf*/
buf[1] = 0x7f;
printf("%2x\n\n\n", buf[1]); /*在終端將會顯示成:7f*/
研究發現,只要字元型變數值的二進位制第一位是1,就會如buf[0]所顯示的那樣,出現6個f。
而格式輸出函式printf中會對所輸出的變數做有符號/無符號型的判斷。如果是有符號型變數,且該值二進位制首位為1(如我們定義的是char buf[100],且buf[0]中為0xbf),則會按照補碼形式前面全置為1,也就是全為f。(因為終端顯示的是8個十六機制數字;另外,我用tobor c編譯,因為tobor c中int是2bytes,終端顯示就成4個十六進製制數字了:ffbf,因此我猜測,printf函式顯示之前先將有符號型值轉換成了乙個4bytes的int。當然,這是函式內部的處理,跟我們所說的話題關係不大。)。
按照上面述說的,如果把buf宣告為unsigned char型,則顯示會變成:bf
而且,如果程式需要講乙個有符號型的變數以十六進製制形式輸出,且只顯示兩位,可以強制型別轉換為無符號型變數,如上面的buf[0],可以轉換成:(unsigned char)buf[0]
(這個是借鑑前人的經驗,在測試中出現了類似問題,特寫此處方便自己檢視)
如果有不妥之處,還請指教!(測試檔案大小1kb,root是樹根,前面是十六進製制輸出,後面是十進位制輸出結果,樹深度為4)
程式設計之路 1 程式設計之路的建議
我熱愛程式設計。我知道大多數人對技術的積累都是來自於平常工作中,工作中用到的就去學,用不到就不學,學一年的知識,然後用個五六年。我也能理解人的理想和追求不同,有的人可能就想平淡點生活。有的人可能是過了拼勁,習慣了安逸。有的人已經認命了。而我現在也每天飽滿工作沒多少時間,但在下班之餘我仍然堅持每天都看...
My 學程式設計之路
誒!奇思妙想 如果自己能開發多好啊!或開發個小型 來賣商品多好啊,小軟體自娛自樂,或許能賺些錢。於是報了線上課堂,隨便點了幾個課堂報了名,還有免費公開課,看到了前端課程,哇一看簡單啊!呆家學又輕鬆 呵呵!還有十萬8千里才能實現你的奇思妙想呢 看了看某些廣告 0基礎入門 什麼4個月精通前端 什麼四個月...
我的程式設計之路
了吧,很感謝這家公司,很感謝當時的boss,也很感謝當時的同事,但由於自己一些個人的原因,還是選擇了離職。沒多久,到了下一家公司,做電子商務,遺憾的是,在這家公司呆了近2年時間,我都沒有收穫太多的東西,最後由於部門重組,開發部門全部離職了。唯一慶幸的是,在這家公司時,我找到了,net知識的海洋,可惜...