是否可以通过GNU coreutils复制SAS md5功能输出?

是否可以通过GNU coreutils复制SAS md5功能输出?,sas,md5,command-line-interface,gnu-coreutils,Sas,Md5,Command Line Interface,Gnu Coreutils,我原以为这会很简单,但这次我已经没有主意了。我正在Windows 7上使用GNU coreutils(这并不意味着它会有任何区别)。我发现这正是我想要的,但如果可能的话,我更愿意通过GNU md5sum找到一种实现这一点的方法 以下是我试图复制的内容: data _null_; length a $32; a = put(md5("Hello"), $hex32.); put a=; run; /*Output to replicate: 8B1A9953C4611296

我原以为这会很简单,但这次我已经没有主意了。我正在Windows 7上使用GNU coreutils(这并不意味着它会有任何区别)。我发现这正是我想要的,但如果可能的话,我更愿意通过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
相同的输出(可能除了大小写差异)?为什么同一个字符串在从stdin读取而不是作为命令行参数读取时会产生不同的MD5散列

更新:按照DomPazz和Rob的建议进行修复:

我想我最好在这一点上使用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,而在于echo。它在“Hello”字符串中添加空格

核实

C:\>echo Hello > c:\temp\test.txt
C:\>md5sum c:\temp\test.txt
--我得到:f0d07a42adce73f0e4bc2d5e1cdb71e5

现在打开文件,注意空白和换行符。删除那些 跑

--我得到8b1a9953c4611296a827abf8c47804d7,它与SAS匹配

编辑: 正如在下面的评论中提到的,GNUecho有-n选项来去除空白

C:\Cygwin\bin>echo.exe -n Hello | md5sum.exe
返回:8b1a9953c4611296a827abf8c47804d7
与SAS值匹配。

据我所知,MD5算法输出仅受两个因素的影响:

  • 源字符串的大小写
  • 源字符串的长度(包括前导/尾随空格、空字符串的长度等)

  • 我的猜测是,您得到不同输出的原因是,不同的方法在字符串中传递不同(可能是默认)长度和/或前导/尾随空格的散列,或者您的引号包含在哈希中。

    您建议如何在命令行上将未修改的字符串传递到md5sum中?您可以编写perl脚本或类似的脚本来去除空白
    echo Hello | stripwhitespace | md5sum.exe
    事实证明,GNU echo有一个-n选项,用于删除尾随空格,从而解决了这个问题。一个小的价格支付,因为我已经有coreutils!那就行了<代码>C:\Cygwin\bin>echo.exe-n Hello | md5sum.exe有效。修改我的答案以包含它。
    C:\Cygwin\bin>echo.exe -n Hello | md5sum.exe