典型的方法建议通过FileStream读取二进制文件并逐字节地比较它.
我正在寻找一种方法来查看文件最后一次在C#中修改.我完全可以访问该文件.
在C#中计算"动态"md5的最佳解决方案是什么,就像未知长度的流的哈希一样?具体来说,我想根据通过网络收到的数据计算哈希值.我知道当发件人终止连接时我已收到数据,所以我不知道提前的长度.
[编辑] - 现在我正在使用md5,但这需要在保存并写入磁盘后再次传递数据.当它从网络进入时,我宁愿哈希它.
我目前正在上载Azure Blob存储上的媒体。一切正常,除非当我尝试将上传媒体的MD5哈希与本地文件(与上传的文件完全相同)时。本地文件返回一个字节数组,其中blob.Properties.ContentMD5返回一个字符串,并且两者都不匹配。
本地MD5哈希: sÔ(F¦“” Db〜[N
blob.Properties.ContentMD5: c9QoHkamgiKTRANifltOGQ ==
有什么办法可以匹配这两个?
我认为这是一个架构和/或设计相关的问题:
我的场景是:
"
我怎样才能实现这一目标(无需逐行循环和比较)?
备注:
我的导出器是.Net控制台应用程序.
我的Db是MS-SQL(如果你需要知道)
我的导出程序定期作为Scheduled TASK运行 - 在PowerShell脚本中
我的应用程序作为Windows服务运行,我将VS2013附加到它的调试过程.我正在获取图像文件内容的哈希码,以检查以下方法的差异(在静态类中):
static class FileUtils
{
public static int GetFileHash(string filePath)
{
int hash = 0;
Logger.WriteLog(ToolTipIcon.Info, "Calculating hash code for {0}", filePath);
StreamReader sr = new StreamReader(filePath, Encoding.Unicode);
hash = sr.ReadToEnd().GetHashCode();
sr.Close();
return hash;
}
}
Run Code Online (Sandbox Code Playgroud)
这在生产中一直很好.但是,对于两个不同的图像,此方法将始终返回2074746262.我试图在winforms应用程序中使用相同的代码和图像重现这一点,我不能.是否存在调试VS2013中的进程会导致此行为的问题?我用一个完全不同的图像替换了其中一个图像,但它仍然会发生.
我正在比较两个字符串,一个我从一个32字符的服务器收到的字符串和另一个我使用以下代码计算的字符串:
string getMd5(string fileName)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(fileName))
{
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "??").ToLower();
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,即使两个字符串看起来相同,比较也会失败,因为上面函数返回的字符串包含的字符多于我收到的字符.请看附图:
那么,我该如何解决这个问题呢?
谢谢.
我正在部署一个文件和一个C#应用程序.我想确保文件与提供的文件相同,否则C#应用程序将显示错误.现在,文件的创建和修改日期可以在修改后更改.C#中是否有任何校验和/哈希等,以确保用户不会更改文件.
c# ×8
.net ×2
file ×2
hash ×2
md5 ×2
architecture ×1
azure ×1
checksum ×1
compare ×1
cryptography ×1
powershell ×1
stream ×1
string ×1
windows ×1