38 %local state digest pair numtext normal i chars nums;
39 %let state=%mf_getuniquename(prefix=_____state_);
40 %let digest=%mf_getuniquename(prefix=_____digest_);
41 %let pair=%mf_getuniquename(prefix=_____pair_);
42 %let numtext=%mf_getuniquename(prefix=_____numtext_);
43 %let normal=%mf_getuniquename(prefix=_____normal_);
44 %let i=%mf_getuniquename(prefix=_____i_);
45 %let chars=%mf_getuniquename(prefix=_____chars_);
46 %let nums=%mf_getuniquename(prefix=_____nums_);
53 if _n_=1 then call missing(&state,&digest,&pair,&numtext,&normal,&i);
54 drop &state &digest &pair &numtext &normal &i;
57 &state = md5(
'DC HASH v2');
59 %
if %length(&cvars)>0 %then %
do;
60 array &chars{*} $ &cvars;
61 do &i = 1 to dim(&chars);
63 &digest = md5(trimn(&chars[&i]));
64 substr(&pair, 1, 16) = &state;
65 substr(&pair, 17, 16) = &digest;
70 %
if %length(&nvars)>0 %then %
do;
71 array &nums{*} &nvars;
72 do &i = 1 to dim(&nums);
78 if missing(&nums[&i]) then &normal = &nums[&i];
79 else &normal = &nums[&i] * 1;
80 &numtext = put(&normal, binary64.);
81 &digest = md5(trim(&numtext));
82 substr(&pair, 1, 16) = &state;
83 substr(&pair, 17, 16) = &digest;
88 &md5_col = put(&state, $hex32.);