我正在编写一个成员(member)提供程序,用于我们现有的成员(member)基础。我使用 EF4.1 进行所有数据库访问,我遇到的问题之一是最初设置数据库时,关系是以编程方式完成的,而不是在数据库中完成。如果需要在并非所有用户都需要的列上建立关系,但为了建立关系确实需要是唯一的(根据我的理解)。
我认为可行的解决方案是在 userid 字段上执行 MD5 散列(这是唯一的......这将/应该保证该字段中的唯一值)。我在 sql server 上遇到问题的部分是在不替换存储在 employeeNum 字段(有问题的那个)中的现有值的情况下执行此操作的查询。
所以简而言之,我的问题是。在值不存在的所有行的 employeeNum
字段(可能基于 userid
字段的 md5 哈希)中获取唯一值的最佳方法是什么。此外,在次要/主要程度上……这听起来像是一个好计划吗?
最佳答案
如果您的问题只是如何为 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;
结果:
userid hash1 hash2
------ ---------------------------------- ------------------------------------------
1 0xC4CA4238A0B923820DCC509A6F75849B 0x356A192B7913B04C54574D18C28D46E6395428AB
2 0xC81E728D9D4C2F636F067F89CC14862C 0xDA4B9237BACCCDF19C0760CAB7AEC4A8359010B0
500 0xCEE631121C2EC9232F3A2F028AD5C89B 0xF83A383C0FA81F295D057F8F5ED0BA4610947817
在 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
后缀的列不包含数字?关于sql-server - 为 SQL Server 中的字段生成唯一哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10952213/