【发布时间】:2009-10-14 10:53:46
【问题描述】:
我有一个 API,其中各种类型都有自定义哈希码。这些散列码基于获取所讨论对象的字符串表示的散列。使用了各种加盐技术,以使哈希码尽可能不冲突,并且具有等效字符串表示的不同类型的对象具有不同的哈希码。
显然,由于哈希码是基于字符串的,因此存在一些冲突(无限字符串与 32 位整数的有限范围)。我使用基于字符串表示的哈希值,因为我需要哈希值在会话中持续存在,尤其是在对象的数据库存储中使用。
今天突然间,我的代码开始为对象生成不同的哈希码,这会破坏各种事情。它今天早些时候工作了,我没有接触过任何涉及哈希码生成的代码。
我知道 .Net 文档允许在 .Net 框架版本(以及 32 位和 64 位版本之间)更改哈希码,但我没有更改框架版本,也没有框架更新据我所知,最近
任何想法,因为这看起来真的很奇怪?
编辑
哈希码生成如下:
//Compute Hash Code
this._hashcode =
(this._nodetype + this.ToString() + PlainLiteralHashCodeSalt).GetHashCode();
【问题讨论】:
-
因为它看起来有点简单,只是作为评论:对象已移动到不同的命名空间,您将对象的完全限定名称用于哈希。这样您就不必触摸代码,只需移动对象即可。
-
字符串表示不是基于类型名称,而是基于对象值的字符串表示
-
我也检查了 SVN,所有具有自定义哈希码的类型的文件都没有完全改变
-
您是否尝试过恢复到旧版本?