2014-10-17 10 views
1

Я ожидал, что это будет довольно просто, но на этот раз у меня закончились идеи. Я работаю с 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*/ 

ответ

2

You проблема не в md5sum, а в эхом. Он добавляет пробел в строку «Hello».

Проверьте

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

- я получаю: f0d07a42adce73f0e4bc2d5e1cdb71e5

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

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

- я получаю 8b1a9953c4611296a827abf8c47804d7, который соответствует SAS.

EDIT: Как упоминалось в комментариях ниже, эхо-выражение GNU имеет параметр -n, чтобы удалить пробел.

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

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

+0

Как бы вы предложили передать неизмененную строку в md5sum в командной строке? – user667489

+0

Вы можете написать скрипт perl или некоторые из них, чтобы удалить пробелы. 'echo Hello | stripwhitespace | md5sum.exe' – DomPazz

+1

Оказывается, что эхо GNU имеет параметр -n, который удаляет конечное пробельное пространство, которое исправляет это. Небольшая цена, так как у меня уже есть coreutils! – user667489

1

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

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

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