C#String.getHashCode()为不同的字符串返回相同的值

Phi*_*hil 3 c# visual-studio-debugging visual-studio-2013

我的应用程序作为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中的进程会导致此行为的问题?我用一个完全不同的图像替换了其中一个图像,但它仍然会发生.

Mic*_*eld 8

首先,您应该知道您使用GetHashCode不正确,原因有两个:

  1. 散列码不是唯一的,只有很好的分布.存在有限数量的哈希码和无限数量的二进制字符串,因此在物理上不可能为每个字符串生成唯一的哈希码.

  2. 哈希码算法的详细信息明确没有记录,并且因为与您无关的原因而更改.特别是,这不是我第一次看到它string.GetHashCode()在调试器下运行时报告更改行为:

string.GetHashCode()在debug vs release中返回不同的值,我该如何避免这种情况?


话虽如此,三个不同的二进制字符串在相同的运行时环境中以不同的方式散列,这取决于是否附加了调试器,这似乎有点不同寻常.除了一般不信任GetHashCode你,我的下一个猜测是你没有哈希你认为你正在哈希的东西.我会在对其进行散列之前将二进制数据本身转储到磁盘,并确认您确实拥有不同的二进制字符串.