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") 并且你使用 "!" 时,你仍然会遇到这种情况。作为分隔符...
我们即将推广一段代码,它使用 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") 并且你使用 "!" 时,你仍然会遇到这种情况。作为分隔符...