首页 文章

计算文件的MD5校验和

提问于
浏览
284

我正在使用iTextSharp从PDF文件中读取文本 . 但是,有时我无法提取文本,因为PDF文件只包含图像 . 我每天都下载相同的PDF文件,我想查看PDF是否已被修改 . 如果无法获得文本和修改日期,MD5校验和是否是判断文件是否已更改的最可靠方法?

如果是的话,一些代码样本会受到赞赏,因为我对密码学没有多少经验 .

5 回答

  • 3

    使用System.Security.Cryptography.MD5非常简单:

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

    (我相信实际上使用的MD5实现无论如何都可能仍然这样做 . )

    你如何比较之后的结果取决于你;例如,您可以将字节数组转换为base64,或直接比较字节数 . (请注意,数组不会覆盖 Equals . 使用base64更容易实现,但如果您真的只想比较哈希值,那么效率会稍微降低 . )

    如果需要将哈希表示为字符串,可以使用 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();
            }
        }
    }
    
  • 644

    如果您需要计算MD5以查看它是否与Azure blob的MD5匹配,那么此SO问题和答案可能会有所帮助:MD5 hash of blob uploaded on Azure doesnt match with same file on local machine

  • 7

    我知道这个问题已经回答了,但这就是我使用的:

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

    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();
    }
    

    可能不是最好的方式,但它可以很方便 .

  • 59

    我是这样做的:

    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));
            }
        }
    }
    
  • 2

    这是我发现的一个稍微简单的版本 . 它一次读取整个文件,只需要一个 using 指令 .

    byte[] ComputeHash(string filePath)
    {
        using (var md5 = MD5.Create())
        {
            return md5.ComputeHash(File.ReadAllBytes(filePath));
        }
    }
    

相关问题