在SAS中,如果每个记录都有md5哈希,则计算整个文件的md5哈希

在SAS中,如果每个记录都有md5哈希,则计算整个文件的md5哈希,sas,md5,checksum,Sas,Md5,Checksum,这是我最近关于在SAS和python中计算md5哈希的问题的后续内容。所以,我使用的是SAS v9.2,有一个md5哈希函数,它接受一个字符串并返回一个哈希。但我真正想要的是一种计算整个文件的哈希值的方法。假设每个记录都有一个散列,有没有办法做到这一点,让文件散列与使用python代码获得的值匹配。以sashelp.shoes数据集为例,我将其导出到CSV文件,并手动删除了货币字段的双引号、美元和逗号。然后,我使用以下python代码计算了整个文件的哈希值: filename = "f:/tes

这是我最近关于在SAS和python中计算md5哈希的问题的后续内容。所以,我使用的是SAS v9.2,有一个md5哈希函数,它接受一个字符串并返回一个哈希。但我真正想要的是一种计算整个文件的哈希值的方法。假设每个记录都有一个散列,有没有办法做到这一点,让文件散列与使用python代码获得的值匹配。以sashelp.shoes数据集为例,我将其导出到CSV文件,并手动删除了货币字段的双引号、美元和逗号。然后,我使用以下python代码计算了整个文件的哈希值:

filename = "f:/test/shoes.csv"
md5_hash = hashlib.md5()
with open(filename,"rb") as f:
    # Read and update hash string value in blocks of 4K
    for byte_block in iter(lambda: f.read(1024*1024),b''):
        md5_hash.update(byte_block.replace(b'\r', b'').replace(b'\n', b''))
    print(md5_hash.hexdigest())
并将此散列作为输出返回:

f7f205b5b844bf57f5f51685969e0df0
如果有人能在SAS中为那个数据集复制这个最终的散列值,那就太好了

PS我在SAS V9.2上

您有两个选择:

  • 在SAS中实现MD5算法。我知道SHA和CRC的现有实现,但我不确定MD5
  • 从SAS调用外部实用程序来计算文件的md5哈希。有一个例子
您有两种选择:

  • 在SAS中实现MD5算法。我知道SHA和CRC的现有实现,但我不确定MD5
  • 从SAS调用外部实用程序来计算文件的md5哈希。有一个例子

    • 不幸的是,您不能在DS1中使用。原因是SAS允许的最大变量大小只有32767字节长。您可以将变量分组到多个变量中,但当您尝试连接它们时(即使是在直接调用md5函数时),最终还是会截断它们。最好是将输出写入外部文本文件(根据前面的示例如下所示)并在其上生成md5sum。这实际上只是额外的一小步。。您可以使用X命令从SAS本身内部执行此操作(前提是您已配置为执行此操作)


      不幸的是,您不能在DS1中使用。原因是SAS允许的最大变量大小只有32767字节长。您可以将变量分组到多个变量中,但当您尝试连接它们时(即使是在直接调用md5函数时),最终还是会截断它们。最好是将输出写入外部文本文件(根据前面的示例如下所示)并在其上生成md5sum。这实际上只是额外的一小步。。您可以使用X命令从SAS本身内部执行此操作(前提是您已配置为执行此操作)


      我前面关于限制的说明仅适用于使用DS1时。DS1中的长度限制是无法绕过的。您可以尝试此操作,但会出现错误:

      data test;
        length x $30000;
        x = repeat('-', 30000);
      run;
      
      data _null_;
        set test;
        format m $hex32.;
        m = md5(catx(',', x, x));
        put m=;
      run;`
      
      但是Robert Pendridge指出DS2可以解决这个问题是正确的

      %let reclen = 201; /* Length of each record */
      %let records = 2000; /* Number of records */
      %let totlen = %eval(&reclen * &records);
      
      proc ds2;
      data _null_;
         retain m;
         dcl char(&totlen) m;
         method run();
            dcl char(200) c;
            set shoes;
            c = catx(',',&varstr2);
            m = strip(m)|| strip(c);
         end;
         method term();
            dcl char(32) hh;
            hh = put(md5(m), $hex32.);
            put hh=;
         end;
      enddata;
      run;
      quit;
      

      这实际上是在做Python代码正在做的事情。
      update
      仅连接字符串并应用散列。您可能需要将其收紧一点,以删除任何多余的空格等,但应该可以使用。

      我前面关于限制的说明仅适用于使用DS1时。DS1中的长度限制是无法绕过的。您可以尝试此操作,但会出现错误:

      data test;
        length x $30000;
        x = repeat('-', 30000);
      run;
      
      data _null_;
        set test;
        format m $hex32.;
        m = md5(catx(',', x, x));
        put m=;
      run;`
      
      但是Robert Pendridge指出DS2可以解决这个问题是正确的

      %let reclen = 201; /* Length of each record */
      %let records = 2000; /* Number of records */
      %let totlen = %eval(&reclen * &records);
      
      proc ds2;
      data _null_;
         retain m;
         dcl char(&totlen) m;
         method run();
            dcl char(200) c;
            set shoes;
            c = catx(',',&varstr2);
            m = strip(m)|| strip(c);
         end;
         method term();
            dcl char(32) hh;
            hh = put(md5(m), $hex32.);
            put hh=;
         end;
      enddata;
      run;
      quit;
      

      这实际上是在做Python代码正在做的事情。
      update
      仅连接字符串并应用散列。您可能需要将此选项收紧一点,以删除任何多余的空格等,但应该可以使用。

      第二个选项不是一个选项,因为它会为数据集的SAS内部格式提供哈希值。数据集中的数据最终将作为文本文件传输到AWS。我想要散列,以便检查我们从SAS提取的数据和最终在AWS中得到的数据是否相同。关于第一点,SAS已经有了MD5功能。但是,它只对字符串进行操作。我可以为数据集的每一行计算md5哈希。我想知道你是否可以用它来计算整个数据集的md5哈希。你是否更关心从SAS提取的数据与原始SAS数据集之间的差异,或者在传输到AWS时引入的错误?通过使用外部实用程序在上传前后对导出的文件进行哈希运算,可以更容易地排除后者。@user2699504如何将其传输到AWS?使用AWS CLI?您可能正在尝试解决一个不需要解决的问题,因为他们在上传后验证文件校验和:第二个选择不是一个选项,因为这将为数据集的SAS内部格式提供哈希。数据集中的数据最终将作为文本文件传输到AWS。我想要散列,以便检查我们从SAS提取的数据和最终在AWS中得到的数据是否相同。关于第一点,SAS已经有了MD5功能。但是,它只对字符串进行操作。我可以为数据集的每一行计算md5哈希。我想知道你是否可以用它来计算整个数据集的md5哈希。你是否更关心从SAS提取的数据与原始SAS数据集之间的差异,或者在传输到AWS时引入的错误?通过使用外部实用程序在上传前后对导出的文件进行哈希运算,可以更容易地排除后者。@user2699504如何将其传输到AWS?使用AWS CLI?您可能正在尝试解决一个不需要解决的问题,因为他们在上传后验证文件校验和:如果您的文件小于32k字节,您可以在常规数据步骤中完成,因为字符变量(仍然!)限制为32767个字符。否则,您可以使用允许更多数据类型(包括更长的字符串)的
      proc ds2
      执行此操作。如果您的文件小于32k字节,则可以在常规dat中执行此操作