Publié le :
Macro SASHELP

Génération d'une expression de hachage MD5

Ce code est également disponible en : Deutsch English Español
Cette macro, mp_md5, construit une chaîne de caractères qui, lorsqu'elle est exécutée dans une étape DATA, calcule un hachage MD5 composite pour les variables spécifiées. Elle est conçue pour être robuste face à des cas complexes comme les grands nombres à virgule flottante, les valeurs manquantes spéciales numériques, et un grand nombre de colonnes. L'algorithme concatène les hachages MD5 de chaque variable individuelle. La documentation indique qu'elle ne fonctionne pas dans une PROC SQL et peut causer des erreurs si l'option 'options dsoptions=nonote2err;' est active et que des données manquantes non spéciales existent.
Analyse des données

Type : SASHELP


La macro est conçue pour s'appliquer à n'importe quelle table SAS en cours de traitement dans une étape DATA. L'exemple fourni dans la documentation utilise la table SASHELP.CLASS, qui est une source interne standard de SAS. Aucune donnée externe n'est nécessaire pour l'exemple.

1 Bloc de code
Macro
Explication :
Définit la macro 'mp_md5' qui prend en paramètres une liste de variables caractères (cvars) et numériques (nvars). La macro génère dynamiquement une série d'appels de fonction SAS. Pour chaque variable, elle calcule un hachage MD5 individuel ('put(md5(...),$hex32.)'). Pour les variables numériques, elle applique une astuce `ifn(missing(&var),&var,&var*1)` pour préserver les valeurs manquantes spéciales tout en corrigeant les erreurs de précision des nombres flottants. Tous les hachages individuels sont ensuite concaténés (séparés par '!!') et le résultat final est lui-même haché par la fonction MD5 pour produire une seule clé de hachage.
Copié !
1%macro mp_md5(cvars=,nvars=);
2%local i var sep;
3put(md5(
4 %DO i=1 %to %sysfunc(countw(&cvars));
5 %let var=%scan(&cvars,&i,%str( ));
6 &sep put(md5(trim(&var)),$hex32.)
7 %let sep=!!;
8 %END;
9 %DO i=1 %to %sysfunc(countw(&nvars));
10 %let var=%scan(&nvars,&i,%str( ));
11 /* multiply by 1 to strip precision errors (eg 0 != 0) */
12 /* but ONLY if not missing, else will lose any special missing values */
13 &sep put(md5(trim(put(ifn(missing(&var),&var,&var*1),binary64.))),$hex32.)
14 %let sep=!!;
15 %END;
16),$hex32.)
17%mend mp_md5;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Auteur principal mentionné : Allan Bowe. Un des fichiers référencés (_version.sas) mentionne : Copyright (c) 2001-2006 Rodney Sparapani, sous licence GNU General Public License.