Publicado el :
Macro SASHELP

Generación de una expresión de hash MD5

Este código también está disponible en: Deutsch English Français
Esta macro, mp_md5, construye una cadena de caracteres que, cuando se ejecuta en un paso DATA, calcula un hash MD5 compuesto para las variables especificadas. Está diseñada para ser robusta frente a casos complejos como números de coma flotante grandes, valores especiales numéricos faltantes y un gran número de columnas. El algoritmo concatena los hashes MD5 de cada variable individual. La documentación indica que no funciona en un PROC SQL y puede causar errores si la opción 'options dsoptions=nonote2err;' está activa y existen datos faltantes no especiales.
Análisis de datos

Type : SASHELP


La macro está diseñada para aplicarse a cualquier tabla SAS que se esté procesando en un paso DATA. El ejemplo proporcionado en la documentación utiliza la tabla SASHELP.CLASS, que es una fuente interna estándar de SAS. No se necesitan datos externos para el ejemplo.

1 Bloque de código
Macro
Explicación :
Define la macro 'mp_md5' que toma como parámetros una lista de variables de caracteres (cvars) y numéricas (nvars). La macro genera dinámicamente una serie de llamadas a funciones SAS. Para cada variable, calcula un hash MD5 individual ('put(md5(...),$hex32.)'). Para las variables numéricas, aplica un truco `ifn(missing(&var),&var,&var*1)` para preservar los valores especiales faltantes mientras corrige los errores de precisión de los números flotantes. Todos los hashes individuales se concatenan (separados por '!!') y el resultado final es a su vez hasheado por la función MD5 para producir una única clave de hash.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : Autor principal mencionado: Allan Bowe. Uno de los archivos referenciados (_version.sas) menciona: Copyright (c) 2001-2006 Rodney Sparapani, bajo licencia GNU General Public License.