Calculate MD5 checksum for a file

前端 未结 6 821
囚心锁ツ
囚心锁ツ 2020-11-22 08:03

I\'m using iTextSharp to read the text from a PDF file. However, there are times I cannot extract text, because the PDF file is only containing images. I download the same P

相关标签:
6条回答
  • 2020-11-22 08:19

    I know this question was already answered, but this is what I use:

    using (FileStream fStream = File.OpenRead(filename)) {
        return GetHash<MD5>(fStream)
    }
    

    Where GetHash:

    public static String GetHash<T>(Stream stream) where T : HashAlgorithm {
        StringBuilder sb = new StringBuilder();
    
        MethodInfo create = typeof(T).GetMethod("Create", new Type[] {});
        using (T crypt = (T) create.Invoke(null, null)) {
            byte[] hashBytes = crypt.ComputeHash(stream);
            foreach (byte bt in hashBytes) {
                sb.Append(bt.ToString("x2"));
            }
        }
        return sb.ToString();
    }
    

    Probably not the best way, but it can be handy.

    0 讨论(0)
  • 2020-11-22 08:21

    This is how I do it:

    using System.IO;
    using System.Security.Cryptography;
    
    public string checkMD5(string filename)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(filename))
            {
                return Encoding.Default.GetString(md5.ComputeHash(stream));
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 08:22

    I know that I am late to party but performed test before actually implement the solution.

    I did perform test against inbuilt MD5 class and also md5sum.exe. In my case inbuilt class took 13 second where md5sum.exe too around 16-18 seconds in every run.

        DateTime current = DateTime.Now;
        string file = @"C:\text.iso";//It's 2.5 Gb file
        string output;
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(file))
            {
                byte[] checksum = md5.ComputeHash(stream);
                output = BitConverter.ToString(checksum).Replace("-", String.Empty).ToLower();
                Console.WriteLine("Total seconds : " + (DateTime.Now - current).TotalSeconds.ToString() + " " + output);
            }
        }
    
    0 讨论(0)
  • 2020-11-22 08:23

    Here is a slightly simpler version that I found. It reads the entire file in one go and only requires a single using directive.

    byte[] ComputeHash(string filePath)
    {
        using (var md5 = MD5.Create())
        {
            return md5.ComputeHash(File.ReadAllBytes(filePath));
        }
    }
    
    0 讨论(0)
  • 2020-11-22 08:25

    It's very simple using System.Security.Cryptography.MD5:

    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            return md5.ComputeHash(stream);
        }
    }
    

    (I believe that actually the MD5 implementation used doesn't need to be disposed, but I'd probably still do so anyway.)

    How you compare the results afterwards is up to you; you can convert the byte array to base64 for example, or compare the bytes directly. (Just be aware that arrays don't override Equals. Using base64 is simpler to get right, but slightly less efficient if you're really only interested in comparing the hashes.)

    If you need to represent the hash as a string, you could convert it to hex using BitConverter:

    static string CalculateMD5(string filename)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(filename))
            {
                var hash = md5.ComputeHash(stream);
                return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 08:40

    And if you need to calculate the MD5 to see whether it matches the MD5 of an Azure blob, then this SO question and answer might be helpful: MD5 hash of blob uploaded on Azure doesnt match with same file on local machine

    0 讨论(0)
提交回复
热议问题