1
votes

Comment brouiller ou hacher des valeurs dans SQL Server?

Je suis en train de créer des données de démonstration à partir de données contenant des informations sur l'historique du patient (PHI). Il y a quelques colonnes où je veux juste générer une valeur aléatoire qui reste cohérente dans toutes les données. Par exemple, il y a un champ comme SSN dans lequel je souhaite créer un chiffre aléatoire à 9 pour chaque SSN unique, mais en gardant ce numéro le même lorsque les revendications concernent la même personne. Ainsi, 1 SSN peut avoir 5 revendications et chaque revendication aura le même SSN créé au hasard.

sample

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

RESULTS:
댛량뇟㻣砖聋蠤

final

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

Comme vous pouvez le voir, le snn a changé, mais reste le même pour tous cas où le ssn était le même.

Pour des nombres comme celui-ci, je peux convertir en un numérique et multiplier / diviser / ajouter / soustraire pour créer un nombre aléatoire qui maintient l'intégrité, mais comment puis-je gérer cela pour les instances où il n'y a pas de nombres?

J'ai essayé d'utiliser HASHBYTES mais j'obtiens beaucoup de caractères étranges. Existe-t-il une autre méthode qui pourrait générer une valeur aléatoire et maintenir la cohérence dans l'ensemble de l'ensemble de données?

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

J'ai lu un certain nombre d'articles à ce sujet, mais je n'ai pas trouvé grand-chose sur le maintien de la cohérence entre plusieurs revendications. J'apprécie vos commentaires.


3 commentaires

C'est une excellente question. Je rencontre un problème similaire!


Le dernier SSMS (préversion) peut en fait avoir la fonctionnalité que vous recherchez prête à l'emploi: Masquage statique des données (SSMS 18.0 Preview)


Nous utilisons HASHBYTES ('SHA1', CONVERT (varchar (max), sourceID)) depuis un certain nombre d'années avec une cohérence produisant des résultats comme 0x166A0DD5 ...... que nous utilisons directement


3 Réponses :


0
votes

Je ne comprends pas votre problème:

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

Cela fonctionne très bien et aura toujours la même valeur. Le problème des caractères brouillés est probablement que vous essayez de convertir une valeur varbinary en nvarchar.

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


2 commentaires

Le HASHBYTES renvoie une chaîne, mais même lors de la diffusion avec votre code ci-dessous, j'obtiens ∽ 樾 ꍉ� ῗ ﷄ


@MartinBobak HashBytes ne renvoie absolument pas de chaîne. Pourquoi lancez-vous la valeur renvoyée par les hashbytes de toute façon?



1
votes

Si je comprends votre requête, c'est pour convertir varbinary en varchar, regardez cet article: varbinary en chaîne sur SQL Server

Et vous pouvez essayer ce code:

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


0 commentaires

1
votes

Je pense que vous voulez des caractères imprimables. Dans ce cas, vous pouvez utiliser la fonction CONVERT pour traduire le résultat d'octets d'un HASHBYTES en une représentation hexadécimale sous forme de chaîne. Assurez-vous simplement de passer la valeur 2 comme troisième paramètre.

Original                                Scrambled
BC9EC2E0-2009-45FA-AA95-64585B815BD9    A33AEBC011E9188EB97E
6FF7E0FE-E054-49D7-A451-80111BF5B200    94F93C6A5CBD0E56C70B
C8F8CD77-96B7-4B74-84B7-4EB3412C6CE7    2994341068CE8C4E1EF9

Quelques résultats:

DECLARE @SomeValue VARCHAR(100) = CONVERT(VARCHAR(100), NEWID())

SELECT
    @SomeValue AS Original,
    CONVERT(
        VARCHAR(20), 
        HASHBYTES('MD5', @SomeValue), 
        2) AS Scrambled

Mettez la longueur que vous voulez comme cible varchar dans le premier paramètre.

Veuillez noter que les fonctions de hachage peuvent générer le même résultat sur différentes entrées, et ce sera particulièrement le cas si vous tronquez le résultat aux N premiers caractères .


1 commentaires

cela a fonctionné! Il semble que je manquais le 3ème argument dans la fonction de conversion.