基本原理
用C#實現在這個過程,我們需要進行下面幾個步驟:
得到當前進程所對應的本地宿主文件;
打開這個文件流;
確定hash算法,計算文件流的hash;
將hash結果轉換為我們熟悉的字符串表現形式。
下面就分別就這幾個方面來進行解釋。
獲取宿主文件路徑
在System.Diagnostics命名空間下,有個Process類,MSDN的描述是"提供對本地和遠程進程的訪問並使您能夠啟動和停止本地系統進程"。該類有一個靜態方法GetCurrentProcess(),利用它我們可以獲取當前進程。
Process類的MainModule屬性包含了該進程所關聯的主模塊,換句話說也就是宿主文件,而MainModule的FileName屬性,就是該宿主文件的完整路徑。
Process currProcess = Process.GetCurrentProcess();
string filePath = currProcess.MainModule.FileName;
更多的關於獲取當前路徑和程序集的方法,可以參見C#獲取當前路徑的方法集合。
打開文件流
這個本來沒什麼好說的,直接用FileStream打開就行,但切記要將FileMode和FileAccess都設置成只讀,否則可能會導致運行時錯誤。
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// hash 算法
fs.Close();
}
確定hash算法
這裡我們用MD5算法為例。
.Net框架為提供了System.Security.Cryptography命名空間,我們使用其中的MD5類來進行hash計算。該類的下面幾個成員需要我們注意:
Create()靜態方法:生成一個MD5類的實例。
ComputeHash()方法:計算輸入數據的哈希值。
在這裡要注意,ComputeHash()所能接受的參數可以是Stream也可以是byte[],為了方便起見我們用前者。它的返回值卻只能是byte[],長度固定為16。
MD5 algorithm = MD5.Create();
byte[] hashData = algorithm.ComputeHash(fs);