SAS 小写 SHA256 字符串

SAS lowercase SHA256 string

目前正在测试 SHA256 函数,以便准备用于另一个应用程序的变量。

用户要求 SHA256 结果小写。我创建了一个快速记录以确保我可以转换字符串-

data have;
input first $ last $ dob $ 10. sex $;
cards;
test person 1955-07-31 1
;
run;

一旦通过 SHA 函数,它似乎将不允许小写字符串。

有解决办法吗?下面的尝试没有产生理想的结果。

data have2;
set have;
source = catt(first,last,dob,sex);
encryp = lowcase(sha256(source));
format encryp $hex64.;
run;

下面将使用 put 语句来实现,其中的格式为:

data have2;
set have;
encryp = lowcase(put(sha256(catt(first,last,dob,sex)),$hex64.));
run;

与您的方法相比,它会显示完全不同的加密代码,但它保持一致。

data have;
input first $ last $ dob $ 10. sex $;
cards;
test person 1955-07-31 1
test person 1955-07-31 1
test2 person 1977-08-11 2
test3 person 1945-12-22 1
;
run;

data have2;
set have;
new_encryp = lowcase(put(sha256(catt(first,last,dob,sex)),hex64.)); /* new method */
encryp = lowcase(sha256(catt(first,last,dob,sex))); /* what you tried */
format encryp $hex64.;
run;

/* output */
first   last    dob         sex new_encryp                                                          encryp
test    person  7/31/1955   1   038a855a47f40edf54094adc4366e3e79c1a931346d7968e96d2cb930b01e7bc    039A857A67F40EDF74096AFC6366E3E79C1A931366D7969E96F2EB930B01E7BC
test    person  7/31/1955   1   038a855a47f40edf54094adc4366e3e79c1a931346d7968e96d2cb930b01e7bc    039A857A67F40EDF74096AFC6366E3E79C1A931366D7969E96F2EB930B01E7BC
test2   person  8/11/1977   2   1117ab614f48a7edfbe9d615f12acad9d564b457b0f31bb2619f7eb9b10f1e58    1117AB616F68A7EDFBE9F615F12AEAF9F564B477B0F31BB261FF7EB9B10F1E78
test3   person  12/22/1945  1   d1cb00ebe044c0553039f99592dc7bd4804eac2c13da8208fd82459c3a37efd1    F1EB00EBE064E0753039F99592FC7BF4806EAC2C13FA8208FD82659C3A37EFF1

问题不在于 sha256 函数,而在于 $HEX64 格式。

当你使用 lowcase 时,你实际上对 SHA256 结果造成了一些伤害:你没有改变十六进制表示,但你实际上改变了字符本身,这意味着你的结果不准确 - 然后你用 $HEX64. 显示它们,它将始终显示十六进制字符的大写字母。

您想要的可能是存储 $HEX64. 格式的小写版本。您可以使用 put:

data want;
  set have;
  source = catt(first,last,dob,sex);
  encryp = sha256(source);
  lower  = lowcase(put(encryp,$HEX64.));
run;

注意 encryp 的样子 - 完全不同的东西,可能不是特别有用。如果你愿意,你当然可以跳过这一步。

*convert case;

%let txt="SEQ_CLAIM_ID, SEQ_MEMB_ID, EFFECTIVE_DATE";

%macro lower_case(txt);
    data;
        text=lowcase(&txt);
    run;
%mend;

%lower_case(&txt);