我们即将推出一段代码,该代码使用SAS md5()
哈希函数来有效跟踪大型数据集中的更改。
format md5 $hex32.;
md5=md5(cats(of _all_));
MD5函数将基于MD5算法的字符串转换为128位哈希值。此哈希值称为消息摘要(数字签名),对于传递给函数的每个字符串几乎都是唯一的。
大约在什么阶段“几乎独一无二”开始造成数据完整性风险(如果有的话)?
答案 0 :(得分:3)
我看过一个md5比较出错的例子。 如果你有价值观" AB"和" CD"在第一行的(两列)和#34; ABC"和" D"在第二行中,它们具有相同的md5值。见这个例子:
data md5;
attrib a b length=$3 informat=$3.;
infile datalines;
input a b;
format md5 $hex32.;
md5=md5(cats(of _all_));
datalines;
AB CD
A BCD
;run;
当然,这是因为CATS(_all_)将连接并剥离变量(使用"最佳"格式将数字转换为字符串),而不使用分隔符。如果您使用CAT,则不会发生这种情况,因为不会删除前导空格和尾随空格。这个错误并不是很遥远。如果您缺少值,则可能会更频繁地发生这种情况。例如,如果文本变量中有很多二进制值,其中一些缺失,则可能经常发生。
可以手动执行此操作,在值之间添加分隔符。当然,当你有(" AB!"" CD")和(" AB"和"!CD& #34;)你使用"!"作为分隔符...
答案 1 :(得分:2)
MD5有2 ^ 128个不同的值,从我读过的2 ^ 64个不同的值(即10 ^ 20左右)开始,你很有可能发现碰撞。
但是,由于MD5的生成方式,您可能会遇到非常相似的预映像的冲突风险,这些预映像仅相差两个字节。因此,很难说这对您的特定流程有多大的风险。肯定是可能,因为只有两条消息就会发生冲突。它不是可能。节省[某些]计算时间是否足以让您超过小风险?