2015-04-28 97 views
3

我的应用程序作为一个Windows服务运行,我将VS2013附加到它的进程调试。我得到的哈希代码的图像文件的内容来检查以下方法差异(静态类中):C#String.getHashCode()为不同的字符串返回相同的值

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; 
    } 
} 

已在生产中正常工作。但是,此方法将始终返回2074746262两个不同的图像。我试图在具有相同代码和图像的WinForms应用程序中重现这一点,但我不能。在VS2013中调试进程会有什么问题会导致这种行为?我用完全不同的图像替换了其中一幅图像,但仍然发生。

+0

什么调用这个样子的代码?它是否穿线? – Liam

+5

谁说'string.GetHashCode'将是唯一的?这取决于代码执行的日期等 –

+3

'GetHashCode'不适用于为大型二进制文件创建摘要。使用例如改为MD5或SHA1散列。谷歌的“密码哈希”。 – stakx

回答

8

首先,你应该知道,你正在使用GetHashCode错误,原因有二:

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

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

string.GetHashCode() returns different values in debug vs release, how do I avoid this?


说了这么多,似乎有点不同寻常, 三个不同的二进制字符串会在同一个运行时环境中进行不同的散列,这取决于是否附加了调试器。除了像你一样不信任GetHashCode,我的下一个猜测是你不会哈希你认为你正在哈希的东西。在散列之前,我会将二进制数据本身转储到磁盘,并确认您确实有不同的二进制字符串。

+1

我已经做了转储,是的他们是不同的。 getHashCode用法是遗留代码。我想我可能会按照建议更新SHA或MD5。 – Phil

1

使用GetHasCode来检查唯一性将永远不会工作,但不能保证每个不同的对象都会给出不同的哈希码。

2

Documentation explicitly calls this out。不要依赖String.GetHashCode来保持独特性。你的假设是错误的。

如果两个字符串对象相等,则GetHashCode方法返回相同的值 。但是,对于每个唯一字符串值, 没有唯一的哈希码值。 不同的字符串可以返回相同的散列 代码

相关问题