Combine it into data step :
%macro eia_md5hex32/parmbuff;
%let list=;
%let n=%sysfunc(countw( %bquote(&syspbuff) , %str(,) ));
%do i=1 %to &n;
%let a&i= %qscan(%bquote(&syspbuff),&i,%str(,%(%)) );
%let list= &list.,a&i ;
%end;
%let list=%substr(%bquote(&list),2);
%syscall sortc(
&list
);
%put &list %bquote(&a1 &a2 &a3) ;
%global sorted_string;
%let sorted_string=;
%do i=1 %to &n;
%let sorted_string= &sorted_string.%bquote(&&a&i) ;
%end;
%put sorted_string: %bquote(&sorted_string) ;
put(md5(symget('sorted_string')), $hex32.)
%mend;
data _null_;
set sashelp.class;
key1=%eia_md5hex32(age,'x',height);
key2=%eia_md5hex32(height,'x',age);
put key1=;
put key2=;
stop;
run;
Xia Keshan
Message was edited by: xia keshan
Yes I see, I've looked back at your original post and see that you did include %LOCAL. I don't think you would need to use _ as first character unless you just like that. I usually save the underscores for data steps where I want to use names that I am reasonably sure won't exist in the users data.
I know I sometimes exaggerate it a bit with the underscore. Like you I use it as an indicator that variables are "temporary".
So combining the ideas posted is sounds like you want a utility macro that will take as input a list of variable names and return the same names in sorted order.
%macro sort_names /parmbuff;
%local i n names result sep;
%let n=%sysfunc(countw(&syspbuff,(, )));
%do i=1 %to &n;
%local v&i;
%let v&i=%upcase(%scan(&syspbuff,&i,(, )));
%let names=&names.&sep.v&i;
%let sep=,;
%end;
%syscall sortc(&names);
%let sep=;
%do i=1 %to &n;
%let result=&result.&sep.&&v&i;
%let sep=,;
%end;
&result
%mend ;
%put %sort_names(a,B,C);
%put %sort_names(x1, x2 ,B,C);
You could then use that as input to CATX() or other functions to generate you unique string.
data _null_;
set sashelp.class;
key1=catx('|',%sort_names(age,'x',height));
key2=catx('|',%sort_names(height,age,'x'));
put key1= / key2= ;
stop;
run;
key1=X|14|69
key2=X|14|69
This is also one of methods.
%macro sort_names/parmbuff;
filename clip clipbrd;
data _null_;
file clip dlm=',';
put "&syspbuff";
data vars;
infile clip dlm=',';
input name $ @@;
name=compress(name,'()');
run;
proc sql;
select name into:result separated by ',' from vars order by name;
quit;
%let result=(&result);
%mend;
%put %sort_names(x,a,d);
%put %sort_names(x1, x2 ,B,C);
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.