c# - .Net 哈希代码不再持久?

标签 c# .net hashcode

我有一个 API,其中各种类型都有自定义哈希代码。这些哈希码基于获取相关对象的字符串表示形式的哈希值。使用各种加盐技术,以便尽可能使哈希码不发生冲突,并且具有等效字符串表示形式的不同类型的对象具有不同的哈希码。

显然,由于哈希码基于字符串,因此存在一些冲突(无限字符串与 32 位整数的有限范围)。我使用基于字符串表示形式的哈希值,因为我需要哈希值在 session 中持续存在,特别是在对象的数据库存储中使用。

今天突然我的代码开始为对象生成不同的哈希代码,这破坏了各种事情。今天早些时候它正在工作,我没有接触任何涉及哈希代码生成的代码。

我知道 .Net 文档允许在 .Net 框架版本之间(以及 32 和 64 位版本之间)更改哈希代码的实现,但我没有更改框架版本,也没有框架更新据我所知最近

有什么想法吗,因为这看起来很奇怪?

编辑

哈希码的生成方式如下:

//Compute Hash Code
this._hashcode = 
   (this._nodetype + this.ToString() + PlainLiteralHashCodeSalt).GetHashCode();

最佳答案

StampedeXV 在他的评论中建议的是 Object.ToString()默认情况下将返回完全限定名称,如果 ToString()未被覆盖。

  1. 如果 ToString() ,则更改命名空间(或类名)将更改此值。未被覆盖。
  2. 显然,最重要的 ToString()会改变它。
  3. 准确检查 _nodeType 的方式和地点已修改。
  4. PlainLiteralHashCodeSalt仍然是一个谜(我认为它是一个常量字符串)。
  5. 没有人保证 String.HashCode()不会改变,所以你至少可以使用 Reflector 来获取方法的源代码并将其包含在你的库中。我通常推荐这种做法,但您将来不想依赖于此。

不用说,您应该跟踪所有 3 个值(_nodeType、th​​is.ToString() 和 salt 字符串)以检查它们是否没有更改。如果您可以恢复到有效的旧版本,那么您就成功了一半。

除此之外,不建议保留哈希码。如果这是与性能相关,请注意,您的数据库有责任处理索引和散列。由于您不能保证它是唯一的,因此它也不是 GUID。那么还有什么意义呢?

但是由于它已经在数据库中,您现在主要关心的是如何恢复 HashCode 实现。

关于c# - .Net 哈希代码不再持久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565570/

相关文章:

c# - 如何在 .NET Core 2.1 中使用 System.Security.Principal.WindowsIdentity

c# - Xamarin XAML 表单的 Stack Layout 布局噩梦

c# - 如何解决 RDotNet REngine 空引用异常

c# - 将枚举转换为 List<string>

java - 如果我不想将我的对象用作哈希表中的键,为什么两个相等的对象应该返回相等的哈希码?

java - Boolean.hashCode()

java - 如何检测 equals() 和 hashCode() 是否与类的字段不同步?

c# - 不安全代码无法在 Visual Studio 2015 上编译

c# - 在 XAML 中为用户控件设置属性

c# - 带有可选参数的接口(interface)实现