代码之家  ›  专栏  ›  技术社区  ›  RobV

.Net哈希码不再持久?

  •  2
  • RobV  · 技术社区  · 17 年前

    我有一个API,其中各种类型都有自定义的哈希代码。这些哈希码基于获取所讨论对象的字符串表示的哈希值。使用各种盐析技术,以便尽可能地避免哈希码冲突,并且具有等效字符串表示的不同类型的对象具有不同的哈希码。

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

    编辑

    哈希码的生成方式如下:

    //Compute Hash Code
    this._hashcode = 
       (this._nodetype + this.ToString() + PlainLiteralHashCodeSalt).GetHashCode();
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   vgru    17 年前

    StampedeXV在评论中暗示的是 Object.ToString() 如果发生以下情况,将默认返回完全限定名 ToString() 没有被超越。

    1. 如果发生以下情况,更改命名空间(或类名)将更改此值 ToString() 没有被超越。
    2. 显然,压倒一切 ToString() 会改变它。
    3. 确切地检查如何以及在哪里 _nodeType 被改进的。
    4. PlainLiteralHashCodeSalt 这仍然是一个谜(我想这是一个恒定的字符串)。
    5. 没有人保证 String.HashCode() 不会改变,因此您至少可以使用Reflector获取方法的源代码并将其包含在您的库中。这是 不 我通常会推荐一些东西,但你将来不想依赖它。

    不用说,您应该跟踪所有3个值(_nodeType、thisToString()和salt string),以检查它们是否没有改变。如果你能恢复到一个有效的旧版本,你就完成了一半。

    绩效相关 ,请注意,您的数据库有责任处理索引和哈希。由于您无法保证它是唯一的,因此它也不是GUID。那么,这有什么意义呢?

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

        2
  •  1
  •   tanascius    17 年前

    你说你使用这个哈希码来实现持久性。对于您当前的实现来说,这是一个坏主意,因为您使用 ToString()
    在你的情况下,我会看看结果 ToString() 方法,也许它改变了。这可以通过更改区域性或将对象移动到另一个名称空间来实现——只要看看,也许你会找到原因。