md5 函数用于合并数据集是否安全?

Is the md5 function safe to use for merging datasets?

我们即将推广一段代码,它使用 SAS md5() 哈希函数来有效地跟踪大型数据集中的变化。

format md5 $hex32.;
md5=md5(cats(of _all_));

根据 documentation:

The MD5 function converts a string, based on the MD5 algorithm, into a 128-bit hash value. This hash value is referred to as a message digest (digital signature), which is nearly unique for each string that is passed to the function.

'nearly unique' 大约在什么阶段开始构成数据完整性风险(如果有的话)?

MD5 有 2^128 个不同的值,根据我读到的 2^64 个不同的值(即 10^20 左右),你开始很有可能发现碰撞。

但是,由于 MD5 的生成方式,您有一些与仅相差两个字节的非常相似的原像发生冲突的风险。因此,很难说这对您的特定流程会有多大风险。至少在两条消息上发生冲突当然是可能不太可能。节省 [一些] 计算时间对您的好处是否足以超过小风险?

我见过一个md5比较出错的例子。 如果您在第一行(两列)中有值 "AB" 和 "CD",在第二行中有 "ABC" 和 "D",则它们具有相同的 md5 值。看这个例子:

data md5;
  attrib a b length= informat=.;
  infile datalines;
  input a b;
  format md5 $hex32.;
  md5=md5(cats(of _all_));
datalines;
AB CD
A BCD
;run;

当然,这是因为 CATS(of _all_) 将连接并剥离变量(使用 "best" 格式将数字转换为字符串),没有分隔符。如果您改为使用 CAT,则不会发生这种情况,因为不会删除前导和尾随空白。这个错误不是很牵强。如果您有缺失值,那么这种情况可能会更频繁地发生。例如,如果文本变量中有很多二进制值,其中一些缺失,则这种情况可能会经常发生。

可以手动执行此操作,在值之间添加分隔符。当然,当你有 ("AB!" 和 "CD") 和 ("AB" 和 "!CD") 并且你使用 "!" 时,你仍然会遇到这种情况。作为分隔符...