我能否使用MD5哈希值的一部分来识别数据?

9
我使用MD5哈希来识别来源未知的文件。没有攻击者,所以我不在意MD5已经被破解了,可以有意地生成冲突。

我的问题是我需要提供日志记录,以便更轻松地诊断不同的问题。如果我将每个哈希记录为十六进制字符串,那太长、不方便且难看了,因此我想缩短哈希字符串。

现在我知道仅取GUID的一小部分是非常糟糕的想法 - GUID旨在是唯一的,但其中的一部分不是。

对于MD5是否也是如此 - 我可以取MD5的前4个字节,并假设由于与原始哈希相比字节数的减少,只会增加碰撞概率吗?


可能是重复的问题,与https://dev59.com/SnRA5IYBdhLWcg3wsgLq相同。 - Andreas Brinck
我在想,是否获取前4个字节比使用md5哈希的CRC32更好。 - Nick Dandoulakis
是的,因为MD5中的前32位应该是完全随机分布的,所以你无法改善分布。 - Andreas Brinck
@Nick D:是的,因为我已经拥有了那个MD5并且它控制着我的程序流程,而CRC32则完全与之无关。 - sharptooth
Sharptooth: 我的意思是在统计学上更好。Andreas 是对的。CRC32 是无意义的,因为 MD5 被设计成在整个 2^128 位范围内具有良好的随机分布。 - Nick Dandoulakis
3个回答

8
短答案是可以,你可以使用前4个字节作为ID。但要注意生日悖论:随着文件数量的增加,碰撞的风险迅速增加。当有50,000个文件时,出现id碰撞的几率大约为25%。编辑:好的,刚刚阅读了您其他问题的链接,100,000个文件发生碰撞的概率大约为70%。请参考:http://en.wikipedia.org/wiki/Birthday_paradox


1

缩短哈希值的另一种方法是将其转换为比HEX更高效的东西,例如Base64或其变体。

即使您决定使用4个字符,使用Base64的4个字符也比十六进制提供更多的位数。


只有当您将十六进制转换为其0-F形式时,才能使用它。您仍然可以获取原始字节值并使用它。在这种情况下,比base-64更多的位数。 - Sekhat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接