我们即将推广一段代码,它使用SAS md5()散列函数有效地跟踪大型数据集中的更改。
format md5 $hex32.;
md5=md5(cats(of _all_));根据文档
MD5函数将基于MD5算法的字符串转换为128位哈希值.此哈希值称为消息摘要(数字签名),对于传递给函数的每个字符串几乎都是唯一的。
大约在什么阶段,“几乎唯一的”开始造成数据完整性风险(如果有的话)?
发布于 2015-01-13 08:56:49
我看到了一个md5比较出错的例子。如果在第一行(两列)中有值"AB“和"CD”,而在第二行中有"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;当然,这是因为(_all_的)猫将连接和剥离变量(使用“最佳”格式将数字转换为字符串),而没有分隔符。如果您使用CAT代替,这将不会发生,因为前导和尾随空白没有被删除。这个错误并不是很难理解。如果您丢失了值,那么这种情况可能会发生得更频繁。例如,如果在文本变量中有很多二进制值,其中一些是缺失的,那么这种情况可能会经常发生。
可以手动完成此操作,在值之间添加一个分隔符。当然,当你有这样的情况时,你仍然会有这种情况("AB!“)和“CD”和("AB“和"!CD")和你使用的"!”作为分隔符..。
发布于 2015-01-12 17:18:42
MD5有2^128个不同的值,从我在2^64个不同值(即10^20左右)所读到的数据来看,您发现碰撞的可能性很大。
但是,由于MD5是如何生成的,您可能会遇到来自非常相似的预图像的碰撞风险,这些图像的差异仅为两个字节。因此,很难说这对您的特定过程会有多大的风险。当然,只有两条消息发生碰撞是可能的。不太可能。节省一些计算时间对你的好处是否足以超过一个小的风险?
https://stackoverflow.com/questions/27906683
复制相似问题