c# - 当被比较的两个字符串相同时,为什么会出现 md5 哈希不匹配?
问题描述
我正在开发一个使用 md5 散列的 C# 程序。使用旧版本的程序创建文件,并将哈希值保存在文件的字段中。这是一个代码片段,显示了哈希和文件的保存:
using (MD5 md5Hash = MD5.Create())
{
this.Hash = string.Empty;
s = JsonConvert.SerializeObject(this, Formatting.Indented);
string hash = MD5hash.GetMd5Hash(md5Hash, s);
this.Hash = hash;
s = JsonConvert.SerializeObject(this, Formatting.Indented);
}
字符串“s”以 JSON 格式保存到文件中,“this”是被序列化的对象。
在程序的新版本中,我试图加载上述文件,但即使我比较了文件并且它们是相同的,md5 哈希也不匹配。这是一个片段:
using (MD5 md5Hash = MD5.Create())
{
hash = MD5hash.GetMd5Hash(md5Hash, s);
if (fhash == hash)
{
return f;
}
else
{
throw new Exception("HashMismatch");
}
}
“fhash”是从文件中加载的,是保存在旧版本中的哈希值。由于上述代码中新版本中的“s”与旧版本中的“s”匹配,因此“hash”和“fhash”应该匹配,但它们不匹配。有什么建议么?
在此先感谢您的帮助!
解决方案
在第一个代码块中,您从具有哈希值的对象生成哈希值,string.empty
但在第二个代码块中,您试图从文件中生成哈希值,该文件使用Hash
属性设置为生成的哈希值进行序列化。
因此,当您为加载的文件生成哈希时,它将生成不同的值,因为该Hash
属性不再与生成原始哈希时使用的值相同,即string.empty
.
当您在第二个代码块中加载文件时,您需要将Hash
属性设置为string.empty
以使哈希值匹配。
推荐阅读
- python - 多处理子进程随机接收 SIGTERM
- python - 从 xyz 坐标列表计算 Pandas 中的距离矩阵
- r - 为什么文档术语矩阵中的行只有零(使用 LDA 函数在 R 中进行主题建模)
- julia - 如何从 Gurobi/JuMP 获取矩阵格式的约束?
- list - SharePoint 2010:列表名称更改导致 listdata.svc 错误
- ruby - Ruby Nokogiri xml 解析
- angular - Angular:数组更改时如何更新视图?
- scala - 在 Apache Spark 的 Scala API 中,使用单引号和 $"" 表示法有区别吗?
- css - 菜单图标垂直对齐
- javascript - 尝试获取数组的平均值时没有得到输出