簡單描述C#哈希值
借助于System.Security.Cryptography命名空間的密碼資源,將非常容易產(chǎn)生與比較C#哈希值。因?yàn)樗械墓:瘮?shù)都接收類型為 Byte() 的輸入,因此可能需要將初始數(shù)據(jù)轉(zhuǎn)換成一個(gè)字節(jié)數(shù)組才能夠?yàn)樗a(chǎn)生哈希值。欲為一個(gè)字符串值建立一個(gè)哈希值,請(qǐng)依下列步驟進(jìn)行:
1、使用Using語句導(dǎo)入System、System.Security、System.Security.Cryptographic與System.Text命名空間,這樣一來,您才不需要于程序代碼中編寫一長串的完整名稱:
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Security.Cryptography;
2、聲明一個(gè)字符串變量來持有您的初始數(shù)據(jù),并聲明兩個(gè)字節(jié)數(shù)組(未定義大小)來持有初始字節(jié)與所產(chǎn)生出的C#哈希值:
- string sSourceData;
- byte[] tmpSource;
- byte[] tmpHash;
3、使用 GetBytes() 方法(它是System.Text.ASCIIEncoding類的一部分)將您的初始字符串轉(zhuǎn)換至一個(gè)字節(jié)數(shù)組中:
- SourceData = "MySourceData";
- // 根據(jù)初始數(shù)據(jù)來建立一個(gè)字節(jié)數(shù)組
- tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
4、通過調(diào)用MD5CryptoServiceProvider類的實(shí)例的ComputeHash方法來為您的初始數(shù)據(jù)計(jì)算出MD5哈希值。請(qǐng)注意,欲計(jì)算出另外一個(gè)哈希值,您必須建立該類的另外一個(gè)實(shí)例。
- // 根據(jù)初始數(shù)據(jù)計(jì)算出哈希值
- tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
5、tmpHash字節(jié)數(shù)組現(xiàn)在會(huì)獲取您初始數(shù)據(jù)的哈希值(128位值=16字節(jié))。將此顯示或儲(chǔ)存成一個(gè)十六進(jìn)制字符串通常會(huì)非常有用,下列程序代碼即是進(jìn)行此項(xiàng)處理:
- lblHashResult.Text = sSourceData + "\n" + ByteArrayToString(tmpHash) + "\n";
- private string ByteArrayToString(byte[] arrInput
- {
- StringBuilder sOutput = new StringBuilder(arrInput.Length);
- for (int i = 0; i < arrInput.Length; i++){
- sOutput.Append(arrInput[i].ToString("X2"));
- }
- return sOutput.ToString();
- }
6、通過上述程序代碼,您便能夠?yàn)槌跏紨?shù)據(jù)產(chǎn)生出哈希值并以一個(gè)十六進(jìn)制字符串來表示。接下來,我們要繼續(xù)說明如何比較兩個(gè)C#哈希值。為初始數(shù)據(jù)建立哈希值的目的之一,就是要提供一種方式來檢查數(shù)據(jù)是否被更改過,或是不通過實(shí)際的值來比較兩個(gè)值。不論是哪一種情況,您都需要比較兩個(gè)哈希值。然而,如果兩個(gè)哈希值皆已儲(chǔ)存成十六進(jìn)制字符串,則比較C#哈希值的操作將會(huì)更加簡易。當(dāng)然,也有可能兩個(gè)哈希值都是以字節(jié)數(shù)組的形式存在。后續(xù)步驟的程序代碼將延續(xù)先前步驟的程序代碼,以便示范如何比較兩個(gè)字節(jié)數(shù)組。
【編輯推薦】