如果您的问题只是如何为 userid 生成哈希值,您可以使用计算列(或在插入过程中生成此值)来实现此目的。我不清楚你是否知道哈希字节 http://msdn.microsoft.com/en-us/library/ms174415%28v=sql.100%29.aspx当您说“最好”时,您会考虑功能或其他标准。
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;
Results:
userid hash1 hash2
------ ---------------------------------- ------------------------------------------
1 0xC4CA4238A0B923820DCC509A6F75849B 0x356A192B7913B04C54574D18C28D46E6395428AB
2 0xC81E728D9D4C2F636F067F89CC14862C 0xDA4B9237BACCCDF19C0760CAB7AEC4A8359010B0
500 0xCEE631121C2EC9232F3A2F028AD5C89B 0xF83A383C0FA81F295D057F8F5ED0BA4610947817
在 SQL Server 2012 中,我强烈建议至少使用 SHA2_256,而不是上述任何一个。 (您忘记提及您正在使用的版本 - 总是有用的信息。)
尽管如此,我仍然想提醒大家注意我在评论中提出的观点:这里的“最佳”解决方案是修复模型。如果employeeNum
是可选的,不应使 EF 认为它是必需的或唯一的,并且如果它实际上不是某种标识符,则不应在关系中使用它。为什么用户会关心之间的冲突employeeNum
and userid
如果您首先为关系使用了正确的属性?
EDIT根据OP的要求
那么这样说有什么错UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL
? If EmployeeNum
将停留在下面1000000
那么你就保证了没有冲突并且完全避免了散列。
您可以生成类似的填充,如果employeeNum
可能包含一个字符串,但又是 EF 提升了这些可怕的列名称吗?为什么一列带有Num
后缀包含除数字之外的任何内容?