如何在SQL Server中加扰或散列值?

时间:2019-01-10 15:24:39

标签: sql sql-server scramble hashbytes

我正在根据包含患者历史记录信息(PHI)的数据创建演示数据。我只想在几列中生成一个随机值,该值在整个数据中保持一致。例如,有一个类似SSN的字段,我想为每个唯一的SSN创建一个随机的9位数字,但是在要求相同个人的情况下,请保持此数字相同。因此,一个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相同的所有实例保持不变。

对于这样的数字,我可以转换为数字并乘以/除以/加/减以创建一个保持完整性的随机数,但是对于有非数字的实例,我该如何处理呢?

我尝试使用HASHBYTES,但收到很多奇怪的字符。是否有另一种方法可以生成随机值并在整个数据集中保持一致性?

RIGHT(convert(NVARCHAR(10), HASHBYTES('MD5', SSN)),10) as SSN

RESULTS:
댛량뇟㻣砖聋蠤

我已经阅读了许多有关此的文章,但是在维护多个声明的一致性方面找不到很多。我感谢任何反馈。

3 个答案:

答案 0 :(得分:1)

如果我了解您的查询,我将把varbinary转换为varchar可以看一下这篇文章: varbinary to string on SQL Server

您可以尝试以下代码:

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

答案 1 :(得分:1)

我认为您需要可打印的字符。在这种情况下,可以使用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个字符,则将特别有用。

答案 2 :(得分:0)

我不明白您的问题:

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

这很好,并且始终保持相同的值。字符混乱的问题可能是您试图将varbinary值转换为nvarchar。

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