计算文件的MD5校验和

时间:2012-05-09 16:16:51

标签: c# .net hash md5

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

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

7 个答案:

答案 0 :(得分:681)

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

答案 1 :(得分:63)

我就是这样做的:

Update table set total_rank_2 =(Select total_rank
  from table
 where total_leve<=total_level_2
 order by total_level Desc
 limit 1)

答案 2 :(得分: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();
}

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:0)

我知道我参加聚会很晚,但是在实际实施解决方案之前进行了测试。

我确实针对内置的MD5类以及md5sum.exe进行了测试。以我为例,内置类每次运行耗时13秒,其中md5sum.exe大约也需要16-18秒。

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

答案 6 :(得分:0)

用于动态生成的 PDF。 创建日期和修改日期总是不同的。

您必须删除它们或将它们设置为常量值。

然后生成 md5 哈希来比较哈希。

您可以使用 PDFStamper 删除或更新日期。