2012-01-11 27 views
4

是md5哈希算法的一个内射函数吗?这意味着它会为任何给定的输入生成一个唯一的输出?是md5的内射函数吗?

如果不是,还有其他一些类似的哈希算法是否是内射?

+2

您可以很容易地证明任何能够处理大于其输出的输入的散列函数不能是内射的。 – thiton 2012-01-11 16:17:48

+0

我不确定这个论证是否有意义,还有什么可以证明的吗? – Yasser1984 2012-01-14 20:58:43

+0

[MD5的最小块长度为512位,输出为128位](http://en.wikipedia.org/wiki/MD5#Algorithm)。它不能是内射的,因为输入数字比输出数字多2^384。你可以谈论一个受限制的MD5,但是你必须定义你的填充方法。 – thiton 2012-01-14 21:07:36

回答

-2

实际上,是的。

实际上,已经证明它确实存在碰撞的可能性。我会用SHA-1代替。 1

+1

实际上=现实。所以不行。 – 2012-01-11 16:14:02

+1

我不认为一个字的答案是适当的。在很多情况下,md5的碰撞几率比它仍然是一个可行的算法选择还要低,这取决于情况。 – KingCronus 2012-01-11 16:16:38

0

md5不是一个内射函数,因为输出小于输入,所以你有比输出更多的输入可能性。

我认为sha-1不是内射的。

+2

你怎么能想到,你对MD5提出的相同论点也不适用于SHA-1? – 2012-01-11 16:13:25

+0

我完全同意,我只是忘了'不'字。 SHA-1不是单射 – JuSchz 2012-01-11 16:16:31

-1

这是另一个可能能够回答你的问题的文章。

技术上不行,但是有,因为他们有相同的机会。

这里是另一篇文章讨论this issue.

6

没有,MD5有collision vunerabilities。其他散列函数(如SHA-1)也具有散列冲突,尽管它比MD5更不可能。

内射散列函数也被称为perfect hash function。完美的散列函数确实存在,但是在你知道你的散列是完美的之前,你需要知道关于输入数据的某些需求或信息。

有关创建完美哈希函数的信息,您可以查看CMPH

+0

如果一个完美的哈希函数可以存在,那么可以说这条评论“你可以很容易地证明,任何能够在比其输出大投入工作的散列函数不能射。”是错的? – Yasser1984 2012-01-14 20:55:27

+0

评论是错误的,因为完美的散列在给定的集合上工作。例如,如果集合是{10,20,30,...}并且哈希函数是函数哈希(int i){return i/10; }'。我认为这个评论实际上意味着输入的_range_。 – cmbuckley 2012-01-15 16:36:08

-1

每个哈希函数都不是内射的。哈希将大型域映射到明显更小的共域。根据鸽子洞原理,这样的函数不能是内射的,因为域中会有项目映射到共域的相同项目。

例如,给散列函数一个大文件作为输入,并接收一个短校验和。有很多可能的大文件(鸽子)比可能的短校验和(鸽子洞)要多,所以“碰撞”肯定会发生。