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

使用ToHashCode在数据库中存储散列?

  •  3
  • Kenoyer130  · 技术社区  · 16 年前

    我们目前广泛使用GetHashCode方法将散列码存储在数据库中以跟踪唯一项。MSDN在这里有个可怕的条目

    我们已经使用这种方法好几年了。我们应该担心吗?如果担心的话,还有什么更好的方法呢?

    3 回复  |  直到 16 年前
        1
  •  2
  •   tvanfosson    16 年前

    使用散列代码作为唯一标识符是一个非常糟糕的主意,因为如果集合足够大,那么最终肯定会发生冲突——而且在统计上可能发生冲突之前,它不必非常大。如果两个对象是相同的(假设相同的散列函数),那么散列代码是一种很好的快速评估方法-如果它们散列到不同的值,那么它们肯定是不同的。但是,如果它们散列到相同的值,则需要进行相等比较,以确保它们是相同的对象。此时,您需要比较使其唯一的对象的属性,即,如果这些属性相同,则对象相同。

    我建议在数据库中使用一个关于自然键属性的唯一索引,并使用一个人工的、自动递增的I d作为主键。然后,您可以确保不会在DB(索引的唯一性约束)中获得重复的插入,但是您可以通过简单地比较DB之外的对象是否具有相同的id(也可以通过主键约束保证其唯一性)来快速比较它们。

        2
  •  2
  •   spender    16 年前

    对。害怕。 GetHashCode 不能保证大于32位的任何类型上都不会发生冲突。考虑到在某些情况下GetHashCode的实现可能不够完美(例如,一些类实现了它们自己的非分布式版本),在某些情况下风险可能更高。无论如何,这是一个糟糕的方法,需要重新考虑。

        3
  •  0
  •   Brian Driscoll    16 年前

    GetHashCode不可靠。

    在这方面你有两个选择:

    1. 重写GetHashCode方法 让它返回一个Guid而不是 一个整数。
    2. 唯一的id值。