哈希总是因不同的字符串而不同吗?

时间:2014-03-20 17:17:38

标签: php hash md5

我尝试使用md5算法的文件名来路径到文件的路径,当然文件名在系统中总是不同的。我很有意思的是,这个哈希总是会因为不同的文件不同而哈希可以重复吗?

这样我从不同的文件中得到相同的哈希值?有限制吗?感谢

3 个答案:

答案 0 :(得分:2)

您不太可能在文件名上发生哈希冲突,但是有可能您可能希望将其视为应用程序中潜在的错误来源(取决于您将要散列的字符串数量) )。

您没有提及是否存在加密文件名的加密原因,如果您确实需要安全加密文件名,则应使用php crypt()函数(md5哈希不被认为是安全的)很长一段时间http://www.kb.cert.org/vuls/id/836068

答案 1 :(得分:1)

是的,您可能会遇到哈希冲突。请参阅有关鸽笼原理和生日悖论的维基百科文章,了解原因。

答案 2 :(得分:1)

哈希冲突是当今密码学和通用计算机科学中的一个主要问题。虽然md5是一个广为人知且使用过的哈希,但冲突在其中非常普遍。碰撞不太可能发生,但它们可能会发生。除非有人试图创建它们,否则它们通常不会发生。

我在这里提交的问题是340282366920938463463374607431768211456可能有md5哈希值(因为它们显示的是十六进制样式,16个字符可能是32个字符长度的字符),但是有无限量的字符串可以进行哈希处理(当然,这取决于计算限制)。

但是,如果可能发生碰撞,开发人员应该做些什么?

我最近在与我的一位新朋友的会面中开展了一项业务,该业务除其他外涉及密码学。他说了一些我以前从未想过的东西。由于我缺乏回忆一次回忆的记忆,这就是这样的事情:“当然,你可以欺骗我的md5,但是试图欺骗我的md5和我的sha256。”他所说的是,作为一名开发人员,我们有大量的编程选项,我们应该利用它们。我们有md5,gost,sha-family,列表可以继续。使用sha256和md5散列你的字符串,你会发现碰撞的可能性大大降低。事实上,它可能会降低到几乎没有任何碰撞机会的程度。

这个的实现:

<?php $salt = "my_secret_salt"; /* this should have numbers, spaces, letters, special characters, etc. */ $stringToHash = $theUsersCookieValues; $time = time(); $hash_1 = hash('md5', $time . $salt . $stringToHash); $hash_2 = hash('sha256', $time . $salt . $stringToHash); setcookie("time_created", $time); setcookie("user", $theUserCookieValues); setcookie("hash_1", $hash_1); setcookie("hash_2", $hash_2); ?> 虽然这涉及到cookie,而不是文件名,但在我的拙见中,它仍然是实现这一原则的好方法。