gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:23:45 24 4
gpt4 key购买 nike

我有一个 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 string)以检查它们是否未更改。如果您可以恢复到有效的旧版本,那么您就成功了一半。

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com