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);
目前正在测试 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);