【问题标题】:string not equal event it is actually equal字符串不相等事件它实际上是相等的
【发布时间】: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-JOINERZERO WIDTH SPACE 字符散布在每个数字组(代码 8204 和 8203)之间。这解释了差异。请查看用于构建字符串的代码并检查它们是否存在于任何地方。例如,"x2" 格式字符串,它是否包含额外的字符?请注意,这两个字符是零宽度,即不可见。

标签: c# winforms hash


【解决方案1】:

一旦你显示了较长字符串的字符输出的字符,解释就很清楚了。

至于为什么会发生这种情况,由于问题的性质,我们很难说清楚。

不管怎样,问题出在这两个:

==8204
==8203

这两个代码点是 0x200C 和 0x200B aka:

这些是不可见的字符,旨在为断词算法和类似的血腥东西提供提示。

简单地说,在您的代码中连接字符串的某个地方,您将这两个字符作为源代码的一部分。由于它们在您的源代码中也不可见(零宽度,请记住)它们很难被发现。

我会查看 thise 中涉及的所有字符串,特别是我会从用于构建哈希码的 "x2" 格式字符串开始,或者可能是返回 MD5 代码以应用更新的代码。

【讨论】:

  • 根据 Matthew Watson 的回答,此代码 updateMD5 = updateMD5.Replace("\0", ""); 中使用的正确代码是什么。
  • 我已经用这个代码string updateMD5 =(((string[])e.Argument)[1].ToUpper().Replace("\u200B", "")).Replace("\u200C","");消除了零与非连接和零宽度空间@
最近更新 更多