0

我试图循环浏览我的数据库和 MD5 哈希我的电子邮件地址。这是我厌倦了使用的代码:

update Recipients set MD5Email = CONVERT(VARCHAR(MAX), HASHBYTES( 'md5', NonMd5.EmailAddress ), 2)
from 
 Recipients INNER JOIN Recipients as NonMd5
on 
 Recipients.Id = NonMd5.Id 

我也试过这个,结果是一样的:

update Recipients set MD5Email = CONVERT(VARCHAR(MAX), HASHBYTES( 'md5', Recipients.EmailAddress ), 2)
    from 
     Recipients

如果我用硬编码字符串替换 NonMd5.EmailAddress,它会正确计算。我不知道出了什么问题。

这是我的表:

CREATE TABLE [dbo].[Recipients] (
[Id] uniqueidentifier NOT NULL DEFAULT (newid()) ,
[EmailAddress] nvarchar(MAX) COLLATE Latin1_General_CI_AS NULL ,
[IsProcessed] bit NOT NULL ,
[MD5Email] nvarchar(80) COLLATE Latin1_General_CI_AS NULL ,
CONSTRAINT [PK__Recipien__3214EC0703317E3D] PRIMARY KEY ([Id])
)
ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO

更新:

如果我将电子邮件地址设置为 test@test.com 这是我的结果: 4767DCA4A82B295C59D18097EE7B4070

在上面的代码中将其作为直接值运行,这是我的结果:

b642b4217b34b1e8d3bd915fc65c4452
4

1 回答 1

1

怎么样:

UPDATE dbo.Recipients 
  SET MD5Email = CONVERT(NVARCHAR(80), HASHBYTES('MD5', EmailAddress), 2);

也就是说,您确实应该考虑 SHA 或其他 MD5 算法,并且您确实不应该将哈希输出存储为字符串- 使用 varbinary。

这是我得到的结果:

SQLFiddle

现在,我认为您缺少一个非常重要的区别。您当前将电子邮件地址存储为NVARCHAR(MAX)- 我不知道您为什么使用 Unicode(世界上大多数服务器仍然不支持双字节字符),我不知道您为什么使用MAX. 但是比较这些:

SELECT CONVERT(NVARCHAR(80), HASHBYTES('MD5', 'test@test.com'), 2);

SELECT CONVERT(NVARCHAR(80), HASHBYTES('MD5', N'test@test.com'), 2);
----------- this N is very important ---------^

鉴于当前的 SMTP 标准,您的列可能应该是 320 个字符(域名为 255 个字符,本地部分为 64 个字符,加上 @ 符号)而不是MAX(没有人的电子邮件地址超过 4000 个字符,更不用说 10 亿个字符)。NVARCHAR只有当您确实需要支持 Unicode 电子邮件地址时才需要- 正如我所说,当今大多数邮件服务器都无法识别这些地址。如果您更改数据类型,您将看到它与您的测试匹配。如果您继续使用NVARCHAR,则需要将苹果与苹果进行比较,因此在运行测试时,请确保在硬编码值前加上N.

于 2013-03-04T19:15:26.903 回答