我正在编写会员提供商,以便与我们现有的会员基础一起使用.我使用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认为它是必需的或唯一的,并且如果它实际上不是某种标识符,则不应在关系中使用它.为什么会约之间的碰撞用户关怀employeeNum和userid如果您使用的是摆在首位的关系,正确的属性?
根据OP的要求编辑
那说什么错了UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL?如果EmployeeNum保持低于1000000那么你就保证没有碰撞,你完全避免了哈希.
你可以生成类似的填充,如果employeeNum可能包含一个字符串,但同样是EF促进这些可怕的列名称?为什么带Num后缀的列包含除数字之外的任何内容?
| 归档时间: |
|
| 查看次数: |
28914 次 |
| 最近记录: |