首页 > 解决方案 > 当被比较的两个字符串相同时,为什么会出现 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”应该匹配,但它们不匹配。有什么建议么?

在此先感谢您的帮助!

标签: c#jsonhashmd5

解决方案


在第一个代码块中,您从具有哈希值的对象生成哈希值,string.empty但在第二个代码块中,您试图从文件中生成哈希值,该文件使用Hash属性设置为生成的哈希值进行序列化。

因此,当您为加载的文件生成哈希时,它将生成不同的值,因为该Hash属性不再与生成原始哈希时使用的值相同,即string.empty.

当您在第二个代码块中加载文件时,您需要将Hash属性设置为string.empty以使哈希值匹配。


推荐阅读