是否可以通过GNU核心实用程序复制SAS md5函数输出



我本以为这会很简单,但这次我没什么想法了。我在Windows7上使用GNU核心实用程序(并不是说它应该有任何区别)。我发现了另一个命令行实用程序,它可以实现我想要的功能,但如果可能的话,我更愿意通过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)coreutilsbinmd5sum.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)md5md5.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的建议进行修复:

我想我还不如在这一点上全力以赴,并与SAS的输出完全匹配:

%let GNUPATH = C:Program Files (x86)coreutilsbin;
%let ECHO = &GNUPATHecho.exe;
%let TR = &GNUPATHtr.exe;
%let CUT = &GNUPATHcut.exe;
%wincmd(""&ECHO"" -n ""Hello"" | ""&MD5SUM"" | ""&TR"" '[a-f]' '[A-F]' | ""&CUT"" -f 1 -d "" "");
/*Output: 8B1A9953C4611296A827ABF8C47804D7*/

问题不在md5sum中,而在echo中。它在"Hello"字符串中添加空白。

验证

C:>echo Hello > c:temptest.txt
C:>md5sum c:temptest.txt

--我得到:f0d07a42adce73f0e4bc2d5e1cdb71e5

现在打开文件,注意到空白和一行换行符。删除这些运行

C:>md5sum c:temptest.txt

--我得到8b1A953c4611296a827abf8c47804d7,它与SAS匹配。

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

C:Cygwinbin>echo.exe -n Hello | md5sum.exe

退货:8b1A953c4611296a827abf8c47804d7其与SAS值相匹配。

据我所知,MD5算法输出只受两件事的影响:

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

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

最新更新