如何在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相同的实例,snn都保持不变。

对于这样的数字,我可以转换为数字,然后乘/除/加/减来创建一个保持完整性的随机数,但对于存在非数字的情况,我该如何处理?

我试着使用HASHYTES,但得到了很多奇怪的字符。是否有其他方法可以生成随机值并在整个数据集中保持一致性?

RIGHT(convert(NVARCHAR(10), HASHBYTES('MD5', SSN)),10) as SSN
RESULTS:
댛량뇟㻣砖聋蠤

我读了很多关于这方面的文章,但我找不到太多关于在多个声明之间保持一致性的内容。我感谢您的反馈。

我想您想要可打印的字符。在这种情况下,可以使用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个字符时。

如果我理解你的查询,那就是将varbinary转换为varchar,看看这篇文章:varbinary到SQL Server 上的字符串

你可以试试这个代码:

SELECT RIGHT(CONVERT(VARCHAR(1000), HASHBYTES('MD5', 'SOMEVALUE'), 1),10);

我不理解您的问题:

SELECT HASHBYTES('MD5', N'Wahoooo') 

这很好用,并且会一直保持相同的值。乱码问题可能是您试图将varbinary值转换为nvarchar。

SELECT CAST(HASHBYTES('MD5', N'Wahoooo') AS nvarchar(10))

相关内容

  • 没有找到相关文章

最新更新