Я ожидал, что это будет довольно просто, но на этот раз у меня закончились идеи. Я работаю с GNU coreutils на Windows 7 (не так, чтобы это имело значение). Я нашел another command line utility, который делает то, что я хочу, но я бы предпочел найти способ сделать это через GNU md5sum, если это возможно.Возможно ли воспроизвести выход функции SAS md5 через GNU coreutils?
Вот что я пытаюсь воспроизвести:
data _null_;
length a $32;
a = put(md5("Hello"), $hex32.);
put a=;
run;
/*Output to replicate: 8B1A9953C4611296A827ABF8C47804D7*/
Вот что я пытался до сих пор:
%macro wincmd /parmbuff;
filename cmd pipe "&SYSPBUFF" lrecl = 32767;
data _null_;
infile cmd lrecl = 32767;
input;
put _infile_;
run;
filename cmd clear;
%mend wincmd;
%let MD5SUM = C:\Program Files (x86)\coreutils\bin\md5sum.exe;
%wincmd(echo Hello | ""&MD5SUM"");
/*Output: f0d07a42adce73f0e4bc2d5e1cdb71e5 *- */
%wincmd(echo Hello | ""&MD5SUM"" -t);
/*Output: adb3f07f896745a101145fc3c1c7b2ea *- */
%wincmd(echo ""Hello"" | ""&MD5SUM"");
/*Output: 2c3a70806465ad43c09fd387e659fbce *- */
%let MD5 = C:\Program Files (x86)\md5\md5.exe;
%wincmd(echo Hello | ""&MD5"");
/*Output: F0D07A42ADCE73F0E4BC2D5E1CDB71E5 (matches md5sum)*/
%wincmd(echo ""Hello"" | ""&MD5"");
/*Output: 2C3A70806465AD43C09FD387E659FBCE (matches md5sum)*/
%wincmd(""&MD5"" -d""Hello"");
/*Output: 8B1A9953C4611296A827ABF8C47804D7 (matches SAS!)*/
Есть ли какая-то форма синтаксиса можно использовать с md5sum
, что приведет к в том же выпуске (за исключением, возможно, различий между верхним и нижним регистром) как SAS и md5 -d
? И почему одна и та же строка создает другой хеш MD5 при чтении из stdin, а не в качестве параметра командной строки?
Обновление: исправить, как это было предложено DomPazz и Роб:
Я думал, что я мог бы также пойти олл-ин с Coreutils в этой точке и соответствует выход SAS точно:
%let GNUPATH = C:\Program Files (x86)\coreutils\bin;
%let ECHO = &GNUPATH\echo.exe;
%let TR = &GNUPATH\tr.exe;
%let CUT = &GNUPATH\cut.exe;
%wincmd(""&ECHO"" -n ""Hello"" | ""&MD5SUM"" | ""&TR"" '[a-f]' '[A-F]' | ""&CUT"" -f 1 -d "" "");
/*Output: 8B1A9953C4611296A827ABF8C47804D7*/
Как бы вы предложили передать неизмененную строку в md5sum в командной строке? – user667489
Вы можете написать скрипт perl или некоторые из них, чтобы удалить пробелы. 'echo Hello | stripwhitespace | md5sum.exe' – DomPazz
Оказывается, что эхо GNU имеет параметр -n, который удаляет конечное пробельное пространство, которое исправляет это. Небольшая цена, так как у меня уже есть coreutils! – user667489