1

我正在从包含患者历史信息 (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 相同的所有实例都保持不变。

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

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

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

RESULTS:
댛량뇟㻣砖聋蠤

我已经阅读了许多关于此的文章,但我找不到太多关于在多个声明中保持一致性的内容。我很感激任何反馈。

4

3 回答 3

1

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

你可以试试这个代码:

SELECT RIGHT(CONVERT(VARCHAR(1000), HASHBYTES('MD5', 'SOMEVALUE'), 1),10);
于 2019-01-10T15:37:45.047 回答
1

我想你想要可打印的字符。在这种情况下,您可以使用该CONVERT函数将 a 的字节结果转换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 个字符。

于 2019-01-10T15:47:12.207 回答
0

我不明白你的问题:

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

这工作得很好,并且始终是相同的值。乱码字符问题可能是您尝试将 varbinary 值转换为 nvarchar。

SELECT CAST(HASHBYTES('MD5', N'Wahoooo') AS nvarchar(10))
于 2019-01-10T15:29:51.283 回答