Можно ли реплицировать вывод функции SAS md5 через GNU coreutils?

Я ожидал, что это будет довольно просто, но на этот раз у меня закончились идеи. Я работаю с GNU coreutils на Windows 7 (не то, чтобы это имело значение). Я нашел другую утилиту командной строки, которая делает то, что я хочу, но я бы предпочел найти способ сделать это через GNU md5sum, если это возможно.

Вот что я пытаюсь воспроизвести:

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 при чтении из стандартного ввода, а не как параметр командной строки?

Обновление: исправить, как предложено 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*/

2 ответа

Решение

У тебя проблема не в md5sum, а в echo. Это добавляет пробел к строке "Hello".

проверить

C:\>echo Hello > c:\temp\test.txt
C:\>md5sum c:\temp\test.txt

- Я получаю: f0d07a42adce73f0e4bc2d5e1cdb71e5

Теперь откройте файл и обратите внимание на пробел и символ новой строки. Удалить те Run

C:\>md5sum c:\temp\test.txt

- Я получаю 8b1a9953c4611296a827abf8c47804d7, что соответствует SAS.

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях ниже, GNU echo имеет опцию -n, чтобы убрать пробел.

C:\Cygwin\bin>echo.exe -n Hello | md5sum.exe

возвращает: 8b1a9953c4611296a827abf8c47804d7, что соответствует значению SAS.

Насколько мне известно, на вывод алгоритма MD5 влияют только 2 вещи:

  1. регистр исходной строки
  2. длина исходной строки (включает начальные / конечные пробелы, длину пустой строки и т. д.)

Я предполагаю, что причина того, что вы получаете разные выходные данные, заключается в том, что разные подходы передают строку в хеш с различной (возможно, по умолчанию) длиной и / или пробелами в начале / в конце, или, возможно, ваши кавычки включаются в хеш.

Другие вопросы по тегам