Hash SAS v python代码和CSV文件中创建的数据集md5哈希的差异

Hash SAS v python代码和CSV文件中创建的数据集md5哈希的差异,hash,sas,md5,Hash,Sas,Md5,员额:1 md5哈希问题 选择权 九百万年前 大家好,我是SAS的新手,需要帮助解决以下问题。我正在试验md5哈希函数,并在sashelp.shoes数据集上进行测试 在datastep中,对于每个输入观察,我将创建一个新变量,该变量是使用带有逗号的catx作为字段分隔符的每个字段的串联。然后,我使用该变量作为md5函数的输入,并确保得到一个哈希值,然后使用PUT将其打印到日志中。我对每个输入行都重复了这一点。但是,我随后将shoes数据集导出到CSV文本文件中。导出将字段括在双引号中,并为我从

员额:1 md5哈希问题 选择权 九百万年前

大家好,我是SAS的新手,需要帮助解决以下问题。我正在试验md5哈希函数,并在sashelp.shoes数据集上进行测试

在datastep中,对于每个输入观察,我将创建一个新变量,该变量是使用带有逗号的catx作为字段分隔符的每个字段的串联。然后,我使用该变量作为md5函数的输入,并确保得到一个哈希值,然后使用PUT将其打印到日志中。我对每个输入行都重复了这一点。但是,我随后将shoes数据集导出到CSV文本文件中。导出将字段括在双引号中,并为我从CSV文件中手动删除的货币字段包含$和逗号。因此,从视觉上看,CSV的行与SAS输出的行完全相同。接下来,我编写了一个小python脚本来读取CSV文本文件的每一行,并为此计算md5哈希。不幸的是,CSV文件的哈希值都与SAS的哈希值不匹配。有人做过类似的事情吗?如果有,你能告诉我哪里出了问题吗。我知道python代码是正确的,因为我在windows中使用内置的md5检查器检查了结果

当我明天再次投入工作时,如果有帮助的话,我会发布一些我正在使用的代码。同时,如果有人能帮忙,我们将不胜感激

我正在使用企业指南V4.3

正如所承诺的,这是我正在使用的SAS代码和我得到的最初几个输出记录


/* concatenate all fields of a dataset and compute a checksum */

proc sql;

select name into :varstr2 separated by ','

from dictionary.columns

where libname = "SASHELP" and

memname = "SHOES";

quit;

 

 

data stuff(drop=check all);

format check $hex32.;

set sashelp.shoes end=end1;

newvar2 = catx(',',&varstr2);

all = catx(',',&varstr2);



check = md5(all);

put all;

put check;

run;

下面是python代码和我得到的相同的输出记录:

import hashlib

filename = "f:/test/shoes.csv"
md5_hash = hashlib.md5()
with open(filename,"r") as f:
    for x in f:
        result=hashlib.md5(x.encode('utf-8'))
        print (x)
        print(result.hexdigest())
更新。我认为这可能与python端的换行符/换行符有关,因此更改了代码,只单独查看第一个输入字符串

import hashlib

x="Africa,Boot,Addis Ababa,12,29761,191821,769"
md5_hash = hashlib.md5()
result=hashlib.md5(x.encode('utf-8')) 
print (x)
print(result.hexdigest())

Africa,Boot,Addis Ababa,12,29761,191821,769
65d38fa13c098fc3959b1eb0c19b0427

Hmmm, still doesn't match with the SAS version

差异来自空间。如果您在SAS中有一个定义为10个字符长的字符串,并且如果您仅使用一个长度仅为5字节的字符串进行赋值,那么该变量中仍将有5个额外的空格

例如:

data sha256 (obs = 2);
  set sashelp.shoes;

  concatenated = strip(Region) || strip(Product) || strip(Subsidiary) || strip(put(Stores,8.));
  shahash = lowcase(put(sha256(concatenated), $hex64.));

run;

这使得:

现在,当我将其修改为(请注意,附加的strip函数会删除连接字符串两侧的所有额外空格):

这使得:

连接的变量长度为59字节(25个来自区域+14个来自产品+12个来自子公司+8个来自商店)。然而,由于内容的精确性,不同的记录长度不同。对连接的字符串应用strip将导致仅对确切内容生成哈希。这与Python相匹配:

comb = [b"AfricaBootAddis Ababa12", b"AfricaMen's CasualAddis Ababa4"]

for item in comb:
    print(str(sha256(item).hexdigest()))


62e548b48b547b8dd112f1440d55db70fd8219e864f571ec58a84400efdba0c0
7b1f64aca891316fd7047d4b39917ee625668c26507b70358c3927f066938ecd


一个额外的空间可能会导致您的MD5不匹配,因此如果您进行手动修复,我不会相信结果。相反,请修改您的导出过程,以按照您想要的方式导出。我要说的是,标准做法是在文本字段周围加引号,以便于阅读,因此您可能希望保留这些引号,以避免实际数据出现问题。读取货币数据是一件非常痛苦的事情,例如,如果货币数据有逗号且没有引号。下面是我正在使用的代码,我认为catx删除了所有空格。正如我所提到的,您需要应用strip()或trim(left())来去掉最终字符串中的空格。因此,请尝试
strip(catx(',',&varstr2))
这应该会给您一个匹配的结果。我执行了您关于应用strip命令的建议,但结果哈希值与以前的数据测试结果相同
data test;md5sum=md5(加沙地带(“非洲,布特,亚的斯亚贝巴,1229761191821769”);格式md5sum$hex32。;放入md5sum;运行给我提供了
65D38FA13C098FC3959B1EB0C19B0427
。你的Python代码也是如此,所以我在SAS中连接字段的方式肯定有问题。有没有其他方法的建议?
data sha256 (obs = 2);
  set sashelp.shoes;

  concatenated = strip(Region) || strip(Product) || strip(Subsidiary) || strip(put(Stores,8.));
  shahash = lowcase(put(sha256(concatenated), $hex64.));

run;

data md5;
  set sashelp.shoes (obs = 2);

  concatenated = strip(Region) || strip(Product) || strip(Subsidiary) || strip(put(Stores,8.));
  shahash = lowcase(put(sha256(strip(concatenated)), $hex64.));

run;
comb = [b"AfricaBootAddis Ababa12", b"AfricaMen's CasualAddis Ababa4"]

for item in comb:
    print(str(sha256(item).hexdigest()))


62e548b48b547b8dd112f1440d55db70fd8219e864f571ec58a84400efdba0c0
7b1f64aca891316fd7047d4b39917ee625668c26507b70358c3927f066938ecd