为SQL Server中的字段生成唯一哈希

Jar*_*red 2 t-sql sql-server

我正在编写会员提供商,以便与我们现有的会员基础一起使用.我使用EF4.1进行所有数据库访问,其中一个我遇到的是当最初设置数据库时,关系是以编程方式而不是数据库中完成的.如果需要在所有用户不需要的列上建立关系,但为了使关系确实需要是唯一的(根据我的理解).

我相信我的解决方案是在userid字段上执行MD5哈希(这是唯一的......这将保证该字段中的唯一值).我在sql server上遇到问题的部分是执行此操作的查询,不替换存储在employeeNum字段中的现有值(有问题的那个).

所以简而言之我的问题是.在尚未存在值的所有行上获取employeeNum字段中的唯一值(可能基于字段的md5哈希值)的最佳方法userid是什么.此外,对于未成年人/主要程度......这听起来像一个好计划吗?

Aar*_*and 10

如果您的问题只是如何为userid生成哈希值,则可以使用计算列(或者在插入过程中生成此值)来执行此操作.我不清楚你是否了解HASHBYTES功能或当你说"最好"时你正在考虑的其他标准.

DECLARE @foo TABLE
(
  userid INT, 
  hash1 AS HASHBYTES('MD5',  CONVERT(VARCHAR(12), userid)),
  hash2 AS HASHBYTES('SHA1', CONVERT(VARCHAR(12), userid))
);

INSERT @foo(userid) SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 500;

SELECT userid, hash1, hash2 FROM @foo;
Run Code Online (Sandbox Code Playgroud)

结果:

userid  hash1                               hash2
------  ----------------------------------  ------------------------------------------
1       0xC4CA4238A0B923820DCC509A6F75849B  0x356A192B7913B04C54574D18C28D46E6395428AB
2       0xC81E728D9D4C2F636F067F89CC14862C  0xDA4B9237BACCCDF19C0760CAB7AEC4A8359010B0
500     0xCEE631121C2EC9232F3A2F028AD5C89B  0xF83A383C0FA81F295D057F8F5ED0BA4610947817
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2012中,我强烈建议至少使用SHA2_256而不是上述任何一种.(你忘了提到你正在使用的版本 - 总是有用的信息.)

总而言之,我仍然想提请注意我在评论中提出的观点:这里的"最佳"解决方案是修复模型.如果employeeNum是可选的,则不应使EF认为它是必需的或唯一的,并且如果它实际上不是某种标识符,则不应在关系中使用它.为什么会约之间的碰撞用户关怀employeeNumuserid如果您使用的是摆在首位的关系,正确的属性?

根据OP的要求编辑

那说什么错了UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL?如果EmployeeNum保持低于1000000那么你就保证没有碰撞,你完全避免了哈希.

你可以生成类似的填充,如果employeeNum可能包含一个字符串,但同样是EF促进这些可怕的列名称?为什么带Num后缀的列包含除数字之外的任何内容?