這是我第一個C#項目,我幾乎是新手。 我使用openfiledialoge選擇文件,並通過GetFullPath方法獲取文件路徑,並將其存儲在一個名爲fpath的變量中。 我需要計算其路徑存儲在fpath變量中的文件的哈希值。我認爲這可以通過GetHashCode完成。任何人都可以給我一個片段或一個小指南?我應該如何在C#中計算文件hash(md5&SHA1)
12
A
回答
28
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", String.Empty);
}
12
下面是一些代碼,我用默認到另一個question迴應對SO
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(string filePath)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(filePath, sha1);
}
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(Stream s)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(s, sha1);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(string filePath)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(filePath, md5);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(Stream s)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(s, md5);
}
private static string GetHash(string filePath, HashAlgorithm hasher)
{
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
return GetHash(fs, hasher);
}
private static string GetHash(Stream s, HashAlgorithm hasher)
{
var hash = hasher.ComputeHash(s);
var hashStr = Convert.ToBase64String(hash);
return hashStr.TrimEnd('=');
}
10
GetHashCode()方法是,僅供內部使用,檢查兩個對象引用是否實際上同一個對象。 deafult hash實現基於堆棧/堆位置,因此不會在程序運行之間確定性(或者甚至將兩個不同的引用與完全相同的數據進行比較)。所以,它不應該用於計算校驗和。
.NET有一個內置庫陣列用於此目的;它們位於System.Security.Cryptography命名空間中。你想這兩個是MD5和SHA1類:
byte[] hashBytes;
using(var inputFileStream = File.Open(filePath))
{
var md5 = MD5.Create();
hashBytes = md5.ComputeHash(inputFileStream);
}
的SHA1
類的工作方式相同。
一句小心; MD5和SHA1都被認爲是「破碎的」,不應該用在任何需要「安全」散列的系統中。考慮在整個系統中使用SHA-256或SHA-512算法。如果你不需要一個安全的哈希,有更快的校驗和散列,如FNV-1a或MurmurHash,這將提供良好的碰撞抵抗。
3
這是一個使用C#託管庫來計算哈希的完整代碼。
using system.IO;
using System.Security.Cryptography;
public string GetSha1Hash(string filePath)
{
using (FileStream fs = File.OpenRead(filePath))
{
SHA1 sha = new SHA1Managed();
return BitConverter.ToString(sha.ComputeHash(fs));
}
}
相關問題
- 1. C# - 自我計算md5以檢查該文件未被修改
- 2. 在大文件上同時計算MD5和SHA1
- 3. md5到sha1密碼hash更改
- 4. 不接受(?轉換SHA1算法MD5)谷歌地圖的Hash值
- 5. Objective-C Raw MD5-hash
- 6. 我應該如何計算在Arduino中
- 7. 如何計算SHA1在iphone
- 8. md5/sha1散列大文件
- 9. C#計算打開的文件的MD5?
- 10. 如何使用C#計算hashbyte SHA1?
- 11. c#md5與PHP md5 hash相同
- 12. 如何計算xls文件的MD5的C語言
- 13. MD5和SHA1 C++哈希庫
- 14. 如何使用我的APK計算特定文件的CRC32/MD5
- 15. 創建torrent文件時計算(sha1)「件」
- 16. 在GPU上計算單個MD5 SHA1散列
- 17. 我可以md5(sha1(密碼))?
- 18. 如何在給定md5散列時查找特定文件Hash
- 19. C#MD5計算問題
- 20. keytool md5 hash ascii?
- 21. 我該如何適應sparql計算?
- 22. 如何在C#中計算「a」的MD5散列?
- 23. 如何計算Python中文件的md5校驗和?
- 24. 如何在保存到gridfs之前計算文件的MD5
- 25. 從部分SHA1總和計算SHA1文件總和
- 26. 計算每個文件的MD5
- 27. 計算大文件的Md5哈希
- 28. 計算視頻文件的MD5(哈希)
- 29. 預計算MD5
- 30. XMPP DIGEST-md5計算響應的算法
我試過這個,我得到這個消息:無法找到類型或命名空間名稱'FileStream'。 – n1kita
您需要添加system.io名稱空間 –
根據我的經驗,'SHA256CryptoServiceProvider'比'SHA256Managed'快很多。這通常是替代品的下降。 –