我有一个 API,其中各种类型都有自定义哈希代码。这些哈希码基于获取相关对象的字符串表示形式的哈希值。使用各种加盐技术,以便尽可能使哈希码不发生冲突,并且具有等效字符串表示形式的不同类型的对象具有不同的哈希码。
显然,由于哈希码基于字符串,因此存在一些冲突(无限字符串与 32 位整数的有限范围)。我使用基于字符串表示形式的哈希值,因为我需要哈希值在 session 中持续存在,特别是在对象的数据库存储中使用。
今天突然我的代码开始为对象生成不同的哈希代码,这破坏了各种事情。今天早些时候它正在工作,我没有接触任何涉及哈希代码生成的代码。
我知道 .Net 文档允许在 .Net 框架版本之间(以及 32 和 64 位版本之间)更改哈希代码的实现,但我没有更改框架版本,也没有框架更新据我所知最近
有什么想法吗,因为这看起来很奇怪?
编辑
哈希码的生成方式如下:
//Compute Hash Code
this._hashcode =
(this._nodetype + this.ToString() + PlainLiteralHashCodeSalt).GetHashCode();
最佳答案
StampedeXV 在他的评论中建议的是 Object.ToString()
默认情况下将返回完全限定名称,如果 ToString()
未被覆盖。
- 如果
ToString()
,则更改命名空间(或类名)将更改此值。未被覆盖。 - 显然,最重要的
ToString()
会改变它。 - 准确检查
_nodeType
的方式和地点已修改。 -
PlainLiteralHashCodeSalt
仍然是一个谜(我认为它是一个常量字符串)。 - 没有人保证
String.HashCode()
不会改变,所以你至少可以使用 Reflector 来获取方法的源代码并将其包含在你的库中。我通常不推荐这种做法,但您将来不想依赖于此。
不用说,您应该跟踪所有 3 个值(_nodeType、this.ToString() 和 salt 字符串)以检查它们是否没有更改。如果您可以恢复到有效的旧版本,那么您就成功了一半。
除此之外,不建议保留哈希码。如果这是与性能相关,请注意,您的数据库有责任处理索引和散列。由于您不能保证它是唯一的,因此它也不是 GUID。那么还有什么意义呢?
但是由于它已经在数据库中,您现在主要关心的是如何恢复 HashCode 实现。
关于c# - .Net 哈希代码不再持久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565570/