如何在 SQL 服务器中打乱或散列值?
How to scramble or hash values in SQL server?
我正在根据包含病史信息 (PHI) 的数据创建演示数据。有几列我只想生成一个在整个数据中保持一致的随机值。例如,有一个像 SSN 这样的字段,我想为每个唯一的 SSN 创建一个随机的 9 位数字,但在同一个人的声明中保持这个数字相同。所以 1 个 SSN 可能有 5 个索赔,每个索赔将具有相同的随机创建的 SSN。
样本
ssn date1 procedure
443234432 1/1/2019 needle poke
443234432 1/2/2019 needle poke
676343522 1/3/2019 total knee procedure
443234432 1/4/2019 total hip procedure
676343522 1/5/2019 needle poke
决赛
ssn date1 procedure
856345544 1/1/2019 needle poke
856345544 1/2/2019 needle poke
979583338 1/3/2019 total knee procedure
856345544 1/4/2019 total hip procedure
979583338 1/5/2019 needle poke
如您所见,snn 已更改,但对于 ssn 相同的所有实例都保持不变。
对于这样的数字,我可以转换为数字并 multiply/divide/add/subtract 以创建一个保持完整性的随机数,但是对于非数字的情况我该如何处理?
我尝试使用 HASHBYTES,但收到很多奇怪的字符。是否有另一种方法可以生成随机值并保持整个数据集的一致性?
RIGHT(convert(NVARCHAR(10), HASHBYTES('MD5', SSN)),10) as SSN
RESULTS:
댛량뇟㻣砖聋蠤
我已经阅读了很多关于此的文章,但我找不到太多关于在多个声明之间保持一致性的文章。我感谢任何反馈。
我不明白你的问题:
SELECT HASHBYTES('MD5', N'Wahoooo')
这很好用,并且始终是相同的值。乱码问题可能是您试图将 varbinary 值转换为 nvarchar。
SELECT CAST(HASHBYTES('MD5', N'Wahoooo') AS nvarchar(10))
如果我理解您的查询,那就是将 varbinary 转换为 varchar,请查看这篇文章:
varbinary to string on SQL Server
你可以试试这个代码:
SELECT RIGHT(CONVERT(VARCHAR(1000), HASHBYTES('MD5', 'SOMEVALUE'), 1),10);
我想你想要可打印的字符。在这种情况下,您可以使用 CONVERT
函数将 HASHBYTES
的字节结果转换为十六进制表示形式的字符串。只需确保将值 2
作为第三个参数传递即可。
DECLARE @SomeValue VARCHAR(100) = CONVERT(VARCHAR(100), NEWID())
SELECT
@SomeValue AS Original,
CONVERT(
VARCHAR(20),
HASHBYTES('MD5', @SomeValue),
2) AS Scrambled
一些结果:
Original Scrambled
BC9EC2E0-2009-45FA-AA95-64585B815BD9 A33AEBC011E9188EB97E
6FF7E0FE-E054-49D7-A451-80111BF5B200 94F93C6A5CBD0E56C70B
C8F8CD77-96B7-4B74-84B7-4EB3412C6CE7 2994341068CE8C4E1EF9
将您想要的长度作为 varchar 目标放在第一个参数中。
请注意,哈希函数可能会在不同的输入上生成相同的结果,尤其是当您将结果截断为前 N 个字符时。
我正在根据包含病史信息 (PHI) 的数据创建演示数据。有几列我只想生成一个在整个数据中保持一致的随机值。例如,有一个像 SSN 这样的字段,我想为每个唯一的 SSN 创建一个随机的 9 位数字,但在同一个人的声明中保持这个数字相同。所以 1 个 SSN 可能有 5 个索赔,每个索赔将具有相同的随机创建的 SSN。
样本
ssn date1 procedure
443234432 1/1/2019 needle poke
443234432 1/2/2019 needle poke
676343522 1/3/2019 total knee procedure
443234432 1/4/2019 total hip procedure
676343522 1/5/2019 needle poke
决赛
ssn date1 procedure
856345544 1/1/2019 needle poke
856345544 1/2/2019 needle poke
979583338 1/3/2019 total knee procedure
856345544 1/4/2019 total hip procedure
979583338 1/5/2019 needle poke
如您所见,snn 已更改,但对于 ssn 相同的所有实例都保持不变。
对于这样的数字,我可以转换为数字并 multiply/divide/add/subtract 以创建一个保持完整性的随机数,但是对于非数字的情况我该如何处理?
我尝试使用 HASHBYTES,但收到很多奇怪的字符。是否有另一种方法可以生成随机值并保持整个数据集的一致性?
RIGHT(convert(NVARCHAR(10), HASHBYTES('MD5', SSN)),10) as SSN
RESULTS:
댛량뇟㻣砖聋蠤
我已经阅读了很多关于此的文章,但我找不到太多关于在多个声明之间保持一致性的文章。我感谢任何反馈。
我不明白你的问题:
SELECT HASHBYTES('MD5', N'Wahoooo')
这很好用,并且始终是相同的值。乱码问题可能是您试图将 varbinary 值转换为 nvarchar。
SELECT CAST(HASHBYTES('MD5', N'Wahoooo') AS nvarchar(10))
如果我理解您的查询,那就是将 varbinary 转换为 varchar,请查看这篇文章: varbinary to string on SQL Server
你可以试试这个代码:
SELECT RIGHT(CONVERT(VARCHAR(1000), HASHBYTES('MD5', 'SOMEVALUE'), 1),10);
我想你想要可打印的字符。在这种情况下,您可以使用 CONVERT
函数将 HASHBYTES
的字节结果转换为十六进制表示形式的字符串。只需确保将值 2
作为第三个参数传递即可。
DECLARE @SomeValue VARCHAR(100) = CONVERT(VARCHAR(100), NEWID())
SELECT
@SomeValue AS Original,
CONVERT(
VARCHAR(20),
HASHBYTES('MD5', @SomeValue),
2) AS Scrambled
一些结果:
Original Scrambled
BC9EC2E0-2009-45FA-AA95-64585B815BD9 A33AEBC011E9188EB97E
6FF7E0FE-E054-49D7-A451-80111BF5B200 94F93C6A5CBD0E56C70B
C8F8CD77-96B7-4B74-84B7-4EB3412C6CE7 2994341068CE8C4E1EF9
将您想要的长度作为 varchar 目标放在第一个参数中。
请注意,哈希函数可能会在不同的输入上生成相同的结果,尤其是当您将结果截断为前 N 个字符时。