如何将电子邮件地址值转换为数字?

How to convert email address values into numbers?

提问人:kuml2 提问时间:11/4/2023 最后编辑:kuml2 更新时间:11/4/2023 访问量:48

问:

有没有办法将电子邮件地址值转换为数字?

上下文:我在一个没有 ID 的表中有一个 EmailAddress 列表,我想从 EmailAddress 生成 ID,以便我可以使用关联的 ID 作为唯一标识符。

我不想生成随机数,目标是每次都根据电子邮件值生成完全相同的数字,如下所示:

例:将“[email protected]”转换为始终“12345”的 sql 查询

将“[email protected]”转换为始终“10101”的 sql 查询,依此类推......

是否有任何函数可以将EmailAddress(假设这可以被视为字符串)转换为数字?

注意 - 目标是没有唯一的随机数,因此不寻找随机 ID

SQL 数据库 数据表 强制 类型转换

评论

0赞 DepletedKnowledge 11/4/2023
为什么不使用数据库生成的 ID?是因为你不希望它是随机的?
0赞 kuml2 11/4/2023
嗨,@DepletedKnowledge确切地说,不是在寻找随机 ID,因为那样我最终会得到与同一电子邮件地址关联的多个 ID。需要一个保持不变的数字,无论多少次,在任何表格中,当电子邮件地址被覆盖到一个数字中时,它应该返回完全相同的数字
0赞 jarlh 11/5/2023
您使用的是哪些 dbms?

答:

1赞 DepletedKnowledge 11/4/2023 #1

有很多方法可以做到这一点,我认为更优雅的一种方法是将这些电子邮件视为密码并对其进行哈希处理。

哈希是使用数学函数将任何长度的输入转换为固定大小的文本字符串的过程。在 SQL 中,您可以使用该函数来实现此目的。HASHBYTES

SQL Server 中的函数可用于将字符串哈希为固定长度的二进制哈希代码。该函数采用两个参数:用于哈希的算法和用于哈希的字符串。例如,可以使用 SHA2_256 算法将电子邮件地址转换为 256 位哈希码。HASHBYTES

下面是如何使用该函数将电子邮件地址转换为唯一号码的示例:HASHBYTES

SELECT HASHBYTES('SHA2_256', '[email protected]') AS HashedEmail;

这将返回一个二进制哈希代码。如果你想把这个二进制哈希码转换成一个数字,你可以把它转换成一个大整数,像这样:

SELECT CAST('' AS XML).value('xs:hexBinary(sql:column("hash"))', 'BIGINT') AS HashedEmail
FROM   (SELECT HASHBYTES('SHA2_256', '[email protected]') AS hash) AS T;

此方法将为每个唯一的电子邮件地址提供一个唯一的数字,该数字将非常大,因为它基于 256 位哈希码。如果需要较小的数字,可以使用不同的哈希算法,也可以截断哈希代码,但这会增加冲突的风险(哈希到相同数字的不同电子邮件地址)。

PS:哈希过程是不可逆的,这意味着您无法从哈希值中检索原始电子邮件地址。

P.S.2:如果你用你正在使用的编程语言而不是SQL来做,你也可以对电子邮件进行哈希处理,并且可能更容易获得号码。

评论

0赞 kuml2 11/4/2023
感谢您分享方法,这很有帮助。一个问题 - 使用此方法转换电子邮件地址总是返回完全相同的数字,还是每次返回一个随机数?
0赞 DepletedKnowledge 11/5/2023
将要哈希的字符串视为算法的“种子”。使用相同的种子将始终产生相同的结果。在您的例子中,种子是电子邮件地址,确保每封电子邮件在散列时始终生成一个不同的 ID。此方法允许您通过重新散列电子邮件来识别相应的 ID。我建议深入研究哈希的概念。乍一看它可能看起来很复杂,但它是一个基本工具,可以阐明你对问题的理解。哈希也可能成为您作为开发人员职业生涯中的一项关键技能。
1赞 kuml2 11/7/2023
您好,感谢您的回复。我尝试了您共享的查询,但它引发了语法错误,所以我尝试自己转换它,并想问您是否可以查看并确认?它似乎对我来说工作正常 - .SELECT EmailAddress, CONVERT(NVARCHAR(25), HASHBYTES('SHA2_256', CAST(EmailAddress as varchar(25))),2) as ConvertedID, FROM MY_EmailList_Table
0赞 DepletedKnowledge 11/7/2023
我现在没有可重现的环境,但对我来说看起来不错。好东西!