bro*_*oke 319 .net c# hash md5
我正在使用iTextSharp从PDF文件中读取文本.但是,有时我无法提取文本,因为PDF文件只包含图像.我每天都下载相同的PDF文件,我想查看PDF是否已被修改.如果无法获得文本和修改日期,MD5校验和是否是判断文件是否已更改的最可靠方法?
如果是的话,一些代码样本会受到赞赏,因为我对密码学没有多少经验.
Jon*_*eet 728
使用System.Security.Cryptography.MD5非常简单:
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
(我相信实际上使用的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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 66
我是这样做的:
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
我知道这个问题已经回答了,但这就是我使用的:
using (FileStream fStream = File.OpenRead(filename)) {
return GetHash<MD5>(fStream)
}
Run Code Online (Sandbox Code Playgroud)
其中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();
}
Run Code Online (Sandbox Code Playgroud)
可能不是最好的方式,但它可以很方便.
这是我发现的一个稍微简单的版本。它一次性读取整个文件,并且只需要一个using指令。
byte[] ComputeHash(string filePath)
{
using (var md5 = MD5.Create())
{
return md5.ComputeHash(File.ReadAllBytes(filePath));
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我迟到了,但在实际实施解决方案之前进行了测试。
我确实对内置 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);
}
}
Run Code Online (Sandbox Code Playgroud)