Questo è il mio primo progetto in C# e sono quasi un principiante. Io uso openfiledialoge per selezionare il file e ottenere il percorso file dal metodo GetFullPath e memorizzarlo in una variabile chiamata ad esempio fpath. Ho bisogno di calcolare l'hash del file che il suo percorso è memorizzato nella variabile fpath. Penso che possa essere fatto tramite GetHashCode. Qualcuno può darmi un frammento o una piccola guida?Come devo calcolare i file hash (md5 e SHA1) in C#
risposta
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", String.Empty);
}
Ecco alcuni codice che ho usato per rispondere a un'altra question su 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('=');
}
GetHashCode() è, per impostazione predefinita, per uso interno, per verificare se due riferimenti a un oggetto sono infatti lo stesso oggetto. L'implementazione dell'hash di deafult si basa sulla posizione stack/heap e quindi non sarà deterministica tra le esecuzioni del programma (o addirittura confrontando due diversi riferimenti con esattamente gli stessi dati). Quindi, non dovrebbe essere usato per calcolare i checksum.
.NET ha una matrice di librerie incorporate che servono a questo scopo; sono nello spazio dei nomi System.Security.Cryptography. I due si desidera sono le classi MD5 e SHA1:
byte[] hashBytes;
using(var inputFileStream = File.Open(filePath))
{
var md5 = MD5.Create();
hashBytes = md5.ComputeHash(inputFileStream);
}
La classe SHA1
funziona allo stesso modo.
Una parola di cautela; sia MD5 che SHA1 sono considerati "interrotti" e non dovrebbero essere usati in nessun sistema che richiede un hash "sicuro". Prendi in considerazione l'utilizzo degli algoritmi SHA-256 o SHA-512 nel sistema generale. Se non hai bisogno di un hash sicuro, ci sono hash più veloci del checksum come FNV-1a o MurmurHash che forniscono una buona resistenza alle collisioni.
Ecco un codice completo che utilizza la libreria gestita C# per calcolare l'hash.
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));
}
}
Ho provato questo da Ho ricevuto questo messaggio: Impossibile trovare il tipo o il nome dello spazio dei nomi 'FileStream'. – n1kita
è necessario aggiungere lo spazio dei nomi system.io –
Nella mia esperienza, 'SHA256CryptoServiceProvider' è un po 'più veloce di' SHA256Managed'. Di solito è una goccia in sostituzione. –