Это мой первый проект С#, и я почти новичок. Я использую openfiledialoge для выбора файла и получаю путь к файлу методом GetFullPath и сохраняю его в переменной, называемой, например, fpath. Мне нужно вычислить хэш файла, что его путь хранится в переменной fpath. Я думаю, что это можно сделать через GetHashCode. Может ли кто-нибудь дать мне фрагмент или небольшой путеводитель?
Как вычислить хэш файлы (md5 & SHA1) в С#
Ответ 1
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", String.Empty);
}
Ответ 2
Вот код, который я использовал для ответа на другой вопрос на 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('=');
}
Ответ 3
GetHashCode() по умолчанию используется только для внутреннего использования, чтобы проверить, являются ли две ссылки на объект фактически одним и тем же объектом. Реализация хеширования deafult основана на расположении стека/кучи и, следовательно, не будет детерминированной между прогонами программы (или даже сравнением двух разных ссылок с точно такими же данными). Поэтому он не должен использоваться для вычисления контрольных сумм.
.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, которые обеспечат хорошее сопротивление столкновению.
Ответ 4
Вот полный код с использованием управляемой библиотеки С# для вычисления хэша.
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));
}
}