使用哈希作为主键?

时间:2012-07-03 13:39:06

标签: c# database sql-server-2008

我需要存储多台计算机的服务列表。我想我会创建一个表来保存所有可能的表的列表,一个表用于所有可能的计算机,然后是一个表来将服务链接到计算机。

我想保持完整服务列表的唯一性,我可以使用可执行文件的哈希作为服务的主键,但我不确定是否会有任何缺点(请注意哈希值)仅用于识别。不用于任何类型的安全目的)。我正在考虑而不是使用二进制字段作为主/外键,我将该值存储为基本64编码的sha512,并使用nvarchar(88)。类似的东西:

CREATE TABLE Services
(
  ServiceHash nvarchar(88) NOT NULL,
  ServiceName nvarchar(256) NOT NULL,
  ServiceDescription nvarchar(256),
  PRIMARY KEY (ServiceHash)
)

此解决方案是否存在任何固有问题? (我将使用SQL 2008数据库并通常通过C#.Net访问它。

2 个答案:

答案 0 :(得分:4)

问题是哈希是按照定义而不是唯一的。你不可能碰撞,但它是可能的。因此,您不能仅使用散列,这意味着整个散列ID都是死胡同。

使用普通ID字段,在ServiceName上使用带索引的唯一约束。

答案 1 :(得分:0)

从性能的角度来看,拥有非增量主键会导致聚簇索引相当快速地分段。

我建议:

  1. 使用INTBIGINT代理PK,并自动增加。
  2. 使用sequential GUID作为PK。索引速度不如INT快,但增量快,因此碎片时间较短。
  3. 然后,您可以在其他列上使用非聚集索引,包括存储哈希值的列。作为VARCHAR,您还可以对其进行全文索引,然后在查找特定哈希时进行精确匹配。

    但是,如果可能,请使用数字哈希,并在其上创建非聚集索引。

    当然,请考虑下面提到的@TomTom