0

这是理论上的问题,但我很好奇。如果我这样做(PHP 中的代码,但在这种情况下语言并不重要)怎么办:

$value  = ''; //starting value
$repeat = false;

while(true)
{

     $value = md5($value);

     /*Save values in database, one row per value*/

     /*Check for repeated hash value in db, and set $repeat flag true if there is one*/

     if($repeat)break;    
}

如您所见,我怀疑会有重复的哈希值。我认为每个现有文本都没有自己的价值,因为这应该意味着每个哈希值都有自己的价值,这没有意义。

我的问题是:那里有关于这个“问题”的文章吗?例如,当我对文件进行哈希处理以检查它们是否有效时,我可能会在一个系统中获得相同的值?这会在任何系统的任何地方引起问题吗?

4

2 回答 2

3

如果您关心多个文本散列到相同的值,请不要使用 MD5。MD5 有快速的碰撞攻击,这违反了你想要的属性。请改用 SHA-2。

当使用安全散列函数时,128 个散列的冲突极难找到,我的意思是我不知道它发生的情况。但是,如果您想避免这种机会,只需使用 256 位哈希。然后使用蛮力找到碰撞现在超出了全人类的计算能力。特别是没有已知的消息对SHA-256(m1) == SHA-256(m2)m1 != m2.

你是对的,哈希不能是唯一的(参见Pidgeonhole 原理),但你真正找到这种情况的机会非常低。所以不要为处理这种情况而烦恼。

我通常以 128 位安全级别为目标,因此当我需要无冲突哈希函数时,我使用 256 位哈希函数,例如 SHA-256。


使用您的哈希链,除非您愿意等待很长时间,否则您不会发现冲突。一旦你有大约 2^(n/2) 次,就可能发生冲突,对于 128 位散列(例如 md5),这是 2^64。我知道没有针对 128 位哈希的暴力冲突。我知道的唯一冲突是精心设计的消息,这些消息利用了您使用的散列方案中的弱点(那些针对 md5 存在的)。

于 2012-08-22T07:21:33.380 回答
-3

通过相同的方法或不同的方法对其进行多次哈希,然后几乎不可能重复它自己,还要检查它们是否重复然后重复哈希函数直到值不同,然后保存在数据库中或在任何你喜欢的地方使用它。 ..

于 2012-08-22T07:28:31.387 回答