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