提问人:kuml2 提问时间:11/4/2023 最后编辑:kuml2 更新时间:11/4/2023 访问量:48
如何将电子邮件地址值转换为数字?
How to convert email address values into numbers?
问:
有没有办法将电子邮件地址值转换为数字?
上下文:我在一个没有 ID 的表中有一个 EmailAddress 列表,我想从 EmailAddress 生成 ID,以便我可以使用关联的 ID 作为唯一标识符。
我不想生成随机数,目标是每次都根据电子邮件值生成完全相同的数字,如下所示:
例:将“[email protected]”转换为始终“12345”的 sql 查询
将“[email protected]”转换为始终“10101”的 sql 查询,依此类推......
是否有任何函数可以将EmailAddress(假设这可以被视为字符串)转换为数字?
注意 - 目标是没有唯一的随机数,因此不寻找随机 ID
答:
有很多方法可以做到这一点,我认为更优雅的一种方法是将这些电子邮件视为密码并对其进行哈希处理。
哈希是使用数学函数将任何长度的输入转换为固定大小的文本字符串的过程。在 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来做,你也可以对电子邮件进行哈希处理,并且可能更容易获得号码。
评论
SELECT EmailAddress, CONVERT(NVARCHAR(25), HASHBYTES('SHA2_256', CAST(EmailAddress as varchar(25))),2) as ConvertedID, FROM MY_EmailList_Table
评论