Php 对于不同的字符串,哈希值总是不同的吗?

Php 对于不同的字符串,哈希值总是不同的吗?,php,hash,md5,Php,Hash,Md5,我尝试用md5算法对文件名的路径进行散列,当然文件名在系统中总是不同的。我感兴趣的是,这个散列对于不同的文件总是不同的,或者散列可以重复 С是否可以从不同的文件中获得相同的哈希值?有什么限制吗?谢谢是的,您可能会遇到哈希冲突。请参阅维基百科关于鸽洞原理和生日悖论的文章,了解为什么。 < P>你不太可能在文件名上进行哈希冲突,但是这是可能的,所以你可能会认为它是你的应用程序中的bug的潜在来源,取决于你要散列多少个字符串。 您没有提到对文件名进行哈希处理是否有任何加密原因,如果您确实需要对文件名进

我尝试用md5算法对文件名的路径进行散列,当然文件名在系统中总是不同的。我感兴趣的是,这个散列对于不同的文件总是不同的,或者散列可以重复


С是否可以从不同的文件中获得相同的哈希值?有什么限制吗?谢谢

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

< P>你不太可能在文件名上进行哈希冲突,但是这是可能的,所以你可能会认为它是你的应用程序中的bug的潜在来源,取决于你要散列多少个字符串。
您没有提到对文件名进行哈希处理是否有任何加密原因,如果您确实需要对文件名进行安全加密,则应使用该函数,而不是md5哈希处理在很长一段时间内都不被认为是安全的

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

我在这里提出的问题是,有340282366920938463463374607431768211456可能的md5哈希,因为它们显示为十六进制样式,16个字符可能提升到32个字符长度的幂次方,但是有无限多的字符串可以进行哈希,这当然排除了等式中的计算限制

但是如果可能发生冲突,开发人员该怎么办

我最近与一位新朋友会面,他经营着一家涉及密码学的公司。他说了一些我以前从未想过的话。由于我缺乏逐字回忆的记忆,所以大致是这样的:当然,你可以愚弄我的md5,但是试着愚弄我的md5和我的sha256。他说的是,作为一名开发人员,我们有大量的编程选项,我们应该利用它们。我们有md5、gost、sha家族,名单还可以继续。使用sha256和md5对字符串进行散列,您将发现冲突的可能性大大降低。事实上,它很可能会降低到你的碰撞机会几乎为零的程度

这方面的实施:


虽然这涉及的是cookies,而不是文件名,但在我看来,这仍然是实现这一原则的好方法。

不,哈希冲突或冲突是两个不同字符串生成相同哈希时使用的术语。这里有冲突的证据:@johncode,但当我打印这两个哈希时,它们是不同的,不明白为什么?@Victor这是因为两个哈希都返回以0e开头的字符串。。。所以PHP将它们视为浮点数,它们最终是相等的。只需使用===进行比较,它将给出正确的结果,而不是使用两个哈希,您可以使用512位或更多的更大的哈希。是的,但从速度的角度来看,sha256和md5的计算时间要比sha512少一点。例如,我只是做一个假设。除此之外,512位的散列只是一个散列。1个哈希比2个哈希更容易欺骗。虽然这两种方法都极不可能,而且可能需要几十年甚至几十年才能找到碰撞的原因,但我仍然大胆猜测,同时愚弄md5和sha256的可能性甚至比愚弄单个512的可能性更小。也就是说,一个人可以做两个512和两种不同的盐,但这似乎太过分了。1个哈希比2个哈希更容易被愚弄。不,事实并非如此,因为在sha 512位上发生冲突的可能性远小于在sha256上发生冲突的可能性x md5冲突的可能性。但是,您发现的md5和sha256的冲突必须彼此相同。至于计算更大哈希的速度,它可以通过使用一个位数等于256+128位的散列来缓解。