熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#中如何產生與比較哈希值

2013-11-13 10:12:53  來源: .NET編程 

    借助於SystemSecurityCryptography命名空間的密碼資源將非常容易產生與比較哈希值因為所有的哈希函數都接收類型為 Byte() 的輸入因此可能需要將初始數據轉換成一個字節數組才能夠為它產生哈希值欲為一個字符串值建立一個哈希值請依下列步驟進行

使用Using語句導入SystemSystemSecuritySystemSecurityCryptographic與SystemText命名空間這樣一來您才不需要於程序代碼中編寫一長串的完整名稱

  using SystemDrawing;

using SystemText;

using SystemWindowsForms;

using SystemSecurityCryptography;



聲明一個字符串變量來持有您的初始數據並聲明兩個字節數組(未定義大小)來持有初始字節與所產生出的哈希值

string sSourceData;

byte[] tmpSource;

byte[] tmpHash;

使用 GetBytes() 方法(它是SystemTextASCIIEncoding類的一部分)將您的初始字符串轉換至一個字節數組中

  sSourceData = MySourceData;


// 根據初始數據來建立一個字節數組

tmpSource = ASCIIEncodingASCIIGetBytes(sSourceData);



通過調用MDCryptoServiceProvider類的實例的ComputeHash方法來為您的初始數據計算出MD哈希值請注意欲計算出另外一個哈希值您必須建立該類的另外一個實例

  // 根據初始數據計算出哈希值

tmpHash = new MDCryptoServiceProvider()ComputeHash(tmpSource);



tmpHash字節數組現在會獲取您初始數據的哈希值(位值=字節)將此顯示或儲存成一個十六進制字符串通常會非常有用下列程序代碼即是進行此項處理

  lblHashResultText = sSourceData + \n + ByteArrayToString(tmpHash) + \n;

private string ByteArrayToString(byte[] arrInput)

{

StringBuilder sOutput = new StringBuilder(arrInputLength);


for (int i = ; i < arrInputLength; i++)

{

sOutputAppend(arrInput[i]ToString(X));

}


return sOutputToString();

}



通過上述程序代碼您便能夠為初始數據產生出哈希值並以一個十六進制字符串來表示接下來
們要繼續說明如何比較兩個哈希值

為初始數據建立哈希值的目的之一就是要提供一種方式來檢查數據是否被更改過或是不通過實際的值來比較兩個值不論是哪一種情況您都需要比較兩個哈希值然而如果兩個哈希值皆已儲存成十六進制字符串則比較哈希值的操作將會更加簡易當然也有可能兩個哈希值都是以字節數組的形式存在

後續步驟的程序代碼將延續先前步驟的程序代碼以便示范如何比較兩個字節數組

請在建立一個十六進制字符串的地方緊接著根據新的初始數據建立一個新的哈希值

  sSourceData = NotMySourceData;

tmpSource = ASCIIEncodingASCIIGetBytes(sSourceData);

byte[] tmpNewHash;

bool bEqual = false;

tmpNewHash = new MDCryptoServiceProvider()ComputeHash(tmpSource);



比較兩個字節數組最直接了當的方式就是通過循環依序處理數組以便一一比較兩數組中的每一個元素如果有任何元素不相同或是兩數組的大小不相同則表示兩值並不相等

  if(tmpNewHashLength == tmpHashLength)

{

int i = ;


while((i < tmpNewHashLength) & & (tmpNewHash[i] == tmpHash[i]))

{

i += ;

}

if(i == tmpNewHashLength)

{

bEqual = true;

}

}


if (bEqual)

{

lblHashResultText += 這兩個哈希值是相同的;

}

else

{

lblHashResultText += 這兩個哈希值並不相同;

}



保存與運行您的項目以便查看根據第一個哈希值所建立的十六進制字符串並確認新的哈希值是否
與初始的相同

完整的程序代碼已編寫在程序范例CH_DemoFormcs的Load事件處理函數中請自行參考之所示則是執行結果 thisstylewidth=; onmousewheel = javascript:return big(this) src=/files/uploadimg//jpg> 圖
From:http://tw.wingwit.com/Article/program/net/201311/12934.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.