计算文件的MD5校验和
我正在使用iTextSharp从PDF文件中读取文本。 但是,有时我无法提取文本,因为PDF文件只包含图像。 我每天下载相同的PDF文件,我想看看PDF是否被修改。 如果文本和修改date不能获得,是一个MD5校验和是最可靠的方式来判断文件是否已经改变?
如果是这样,一些代码示例将不胜感激,因为我没有太多的密码学经验。
使用System.Security.Cryptography.MD5非常简单:
using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { return md5.ComputeHash(stream); } }
(我相信实际上使用的MD5实现不需要处理,但是反正我可能仍然这么做)。
你如何比较结果是由你决定的; 您可以将字节数组转换为base64,或直接比较字节。 (请注意,数组不会覆盖Equals
,使用base64更容易得到正确的结果,但是如果您真的只是比较哈希值,那么效率会稍差一点。)
如果您需要将散列表示为string,则可以使用BitConverter
将其转换为hex:
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(); } } }
这是我如何做到的:
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)); } } }
我知道这个问题已经回答了,但是这是我使用的:
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(); }
可能不是最好的方法,但它可以得心应手。
这是我发现的一个稍微简单的版本。 它一次读取整个文件,只需要一个using
指令。
byte[] ComputeHash(string filePath) { using (var md5 = MD5.Create()) { return md5.ComputeHash(File.ReadAllBytes(filePath)); } }
如果您需要计算MD5以查看它是否与Azure blob的MD5匹配,那么这个问题和答案可能会有所帮助: 在Azure上上传的blob的MD5散列不会与本地计算机上的相同文件匹配