Feedback

C# - Checksumme von Datei berechnen

Veröffentlicht von am 22.11.2015
(0 Bewertungen)
Erweiterungsmethoden für FileInfo, die die Prüfsumme der Datei berechnen. Unterstützt werden MD5, SHA1 und SHA256. Das Berechnen funktioniert auch bei sehr großen Dateien, da die Prüfsummen schrittweise berechnet werden und sich nicht die komplette Datei im Speicher befinden muss.

Beispiel:
var file = new FileInfo(@"C:\my_big_file.bin");
var md5 = file.GetMD5Hash();
using System.IO;
using System.Security.Cryptography;

public static class FileInfoExtension
{
	/// <summary>
	/// Gibt eine Bytefolge in Hexadezimaldarstellung aus.
	/// </summary>
	/// <param name="data"></param>
	/// <returns></returns>
	private static string ToHexString(IEnumerable<byte> data)
	{
		var sb = new StringBuilder();
		foreach (byte b in data)
		{
			sb.AppendFormat("{0:X2}", b);
		}
		return sb.ToString();
	}

	/// <summary>
	/// Berechnet mithilfe des übergebenen HashAlgorithm den Hash eines FileStreams.
	/// </summary>
	/// <param name="stream"></param>
	/// <param name="algorithm"></param>
	/// <returns></returns>
	private static string GetHash(FileStream stream, HashAlgorithm algorithm)
	{
		var buffer = new byte[4096];
		int count;
		while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
		{
			int offset = 0;
			while (offset < count)
				offset += algorithm.TransformBlock(buffer, offset, count - offset, buffer, offset);
		}

		algorithm.TransformFinalBlock(buffer, 0, 0);

		return ToHexString(algorithm.Hash);
	}

	/// <summary>
	/// Berechnet den MD5 Hash einer Datei.
	/// </summary>
	/// <param name="file"></param>
	/// <returns></returns>
	public static string GetMD5Hash(this FileInfo file)
	{
		using (var stream = file.OpenRead())
		{
			using (var md5 = MD5.Create())
			{
				return GetHash(stream, md5);
			}
		}
	}

	/// <summary>
	/// Berechnet den SHA1 Hash einer Datei.
	/// </summary>
	/// <param name="file"></param>
	/// <returns></returns>
	public static string GetSHA1Hash(this FileInfo file)
	{
		using (var stream = file.OpenRead())
		{
			using (var sha1 = SHA1.Create())
			{
				return GetHash(stream, sha1);
			}
		}
	}

	/// <summary>
	/// Berechnet den SHA256 Hash einer Datei.
	/// </summary>
	/// <param name="file"></param>
	/// <returns></returns>
	public static string GetSHA256Hash(this FileInfo file)
	{
		using (var stream = file.OpenRead())
		{
			using (var sha1 = SHA256.Create())
			{
				return GetHash(stream, sha1);
			}
		}
	}
}
Abgelegt unter FileInfo, Checksum, MD5.

1 Kommentare zum Snippet

Anonymous2 schrieb am 23.11.2015:
Statt den Stream in Blöcken zu lesen, kannst du auch gleich die ComputeHash Funktion aufrufen, die einen Stream entgegen nimmt. Die macht intern nichts anderes als deine Funktion.

So wie du es machst, habe ich es auch einmal gemacht, allerdings wurden bei mir gleichzeitig MD5, SHA1, SHA256 und CRC32 berechnet. Da ergab das selbst lesen Sinn, da man mit den Stream Funktionen die Datei 4mal hätte einlesen müssen, so genügte ein mal.
 

Logge dich ein, um hier zu kommentieren!