【发布时间】:2017-03-20 13:21:34
【问题描述】:
我的应用程序具有自动更新功能。为了验证它是否成功下载了文件,我比较了两个哈希值,一个是 xml,另一个是下载后生成的哈希值。这两个散列是相同的,但它让我觉得这两个散列不一样。当我检查大小时,xml哈希字符串有66个,另一个是36个。我使用trim方法但仍然没有运气。
string file = ((string[])e.Argument)[0];
string updateMD5 = "--"+((string[])e.Argument)[1].ToUpper()+"--";
string xx="--"+Hasher.HashFile(file, HashType.MD5).ToUpper()+"--";
// Hash the file and compare to the hash in the update xml
int xxx = (updateMD5.Trim()).Length;
int xxxxx = xx.Trim().Length;
if (String.Equals(updateMD5.Trim(), xx.Trim(), StringComparison.InvariantCultureIgnoreCase))
e.Result = DialogResult.OK;
else
e.Result = DialogResult.No;
哈希码
internal static string HashFile(string filePath, HashType algo)
{
switch (algo)
{
case HashType.MD5:
return MakeHashString(MD5.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
case HashType.SHA1:
return MakeHashString(SHA1.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
case HashType.SHA512:
return MakeHashString(SHA512.Create().ComputeHash(new FileStream(filePath, FileMode.Open)));
default:
return "";
}
}
private static string MakeHashString(byte[] hash)
{
StringBuilder s = new StringBuilder();
foreach (byte b in hash)
s.Append(b.ToString("x2").ToLower());
return s.ToString();
}
StringBuilder s=new StringBuilder();
foreach (char c in updateMD5.Trim())
s.AppendLine(string.Format("{0}=={1}",c,(int)c));
【问题讨论】:
-
请在文本中包含minimal reproducible example
-
显然您在此处显示的内容不匹配,左侧的字符串显然不是 66 个字符长。请确保您正在寻找正确的东西。
-
自定义类“Hasher”?请也提供您的功能。
-
鉴于显示的代码,唯一的解释是
updateMD5包含不可见字符。尝试将其作为单个字符代码转储以进行检查。也可以试试updateMD5 = updateMD5.Replace("\0", "");我猜它会有一堆 nul 字符,因为它被存储为 Unicode 并作为其他东西读入。 -
显然你有一个
ZERO WIDTH NON-JOINER和ZERO WIDTH SPACE字符散布在每个数字组(代码 8204 和 8203)之间。这解释了差异。请查看用于构建字符串的代码并检查它们是否存在于任何地方。例如,"x2"格式字符串,它是否包含额外的字符?请注意,这两个字符是零宽度,即不可见。