Math 理论上,使用MD5算法对某个值进行2^128次哈希运算

Math 理论上,使用MD5算法对某个值进行2^128次哈希运算,math,hash,md5,theory,Math,Hash,Md5,Theory,这是一个纯粹的假设问题,但是如果你从128位开始,然后将它们散列2^128次,比如用MD5算法,你最终会回到原来的位吗?会使用所有可能的组合吗?如果没有,是否有某些Nuber比其他Nuber“回到自己”的速度更快 我假设这实际上是不可能实现的(在看了我的计算器对2^128的答案后…),我很确定答案对于不同的算法是不同的,但这并不能阻止一个人理论化,是吗 是的,就是这样,希望有人能对这个话题有更多的了解。期待看到答案,提前感谢 编辑: 澄清一下:在这个问题上,我最感兴趣的是如果它将遍历所有可能的位

这是一个纯粹的假设问题,但是如果你从128位开始,然后将它们散列2^128次,比如用MD5算法,你最终会回到原来的位吗?会使用所有可能的组合吗?如果没有,是否有某些Nuber比其他Nuber“回到自己”的速度更快

我假设这实际上是不可能实现的(在看了我的计算器对2^128的答案后…),我很确定答案对于不同的算法是不同的,但这并不能阻止一个人理论化,是吗

是的,就是这样,希望有人能对这个话题有更多的了解。期待看到答案,提前感谢

编辑:
澄清一下:在这个问题上,我最感兴趣的是如果它将遍历所有可能的位组合,或者如果有几个较小的循环,那么任何附加的、相关的和有趣的信息都是值得赞赏的。

一个好的加密散列应该包含一些但不太多的循环,这使得为它创建彩虹表变得更加困难。这种情况发生在MD5中——实际上,MD5的一个问题是,为算法的给定哈希查找哈希冲突有点容易。这个弱点使得在计算上可以将恶意数据注入到使用MD5散列的文件中进行验证

我想你认为MD5有一些特性,但事实并非如此。散列函数可能很快就会开始循环运行,而且应该如此

还有一种非常有效的内存查找方法。也来看看


如果您真的想要一个128位id的唯一“散列”,您应该使用一个普通的加密算法,例如AES,一个特定的数字和一个密钥。这将为您提供一个“随机”的、唯一的数字行,形成一个递增的id,因为您可以始终以唯一的方式解密信息,给定用于加密数据的相同密钥。

一个好的加密哈希应该包含一些但不太多的循环,这使得为其创建彩虹表变得更加困难。这种情况发生在MD5中——实际上,MD5的一个问题是,为算法的给定哈希查找哈希冲突有点容易。这个弱点使得在计算上可以将恶意数据注入到使用MD5散列的文件中进行验证

我想你认为MD5有一些特性,但事实并非如此。散列函数可能很快就会开始循环运行,而且应该如此

还有一种非常有效的内存查找方法。也来看看



如果您真的想要一个128位id的唯一“散列”,您应该使用一个普通的加密算法,例如AES,一个特定的数字和一个密钥。这将为您提供一个“随机”的、唯一的数字行,形成一个递增的id,因为您可以始终以唯一的方式对信息进行解密,给定用于加密数据的相同密钥。

对我来说,如果您有128位,那么您的集合中只有2^128个组合/项。因此,在某个时刻,如果将一个值散列2^128次,就会发生冲突。显然必须有一些循环,因为值的数量是有限的。但并非每个数字都必须是一个循环的成员。这可能有点像康威的人生游戏:有一些周期性的配置,还有一些配置最终落入其中。有些散列是破坏性的,有些则不是。对MD5一无所知。使用破坏性散列,您将永远(很难)循环返回,但最终将在少量模式上“稳定”。这个问题是理论性的,而不是实际的。排列可以分解为一组循环。将128位映射到128位时的MD5不是排列。相反,这将看起来像一个周期和“尾巴”的集合。如果你将散列重复2^128次,你必须在一个循环中结束。对我来说,如果你有128位,那么你的集合中只有2^128个组合/项。因此,在某个时刻,如果将一个值散列2^128次,就会发生冲突。显然必须有一些循环,因为值的数量是有限的。但并非每个数字都必须是一个循环的成员。这可能有点像康威的人生游戏:有一些周期性的配置,还有一些配置最终落入其中。有些散列是破坏性的,有些则不是。对MD5一无所知。使用破坏性散列,您将永远(很难)循环返回,但最终将在少量模式上“稳定”。这个问题是理论性的,而不是实际的。排列可以分解为一组循环。将128位映射到128位时的MD5不是排列。相反,这将看起来像一个周期和“尾巴”的集合。如果你将散列重复2^128次,你必须在一个循环中结束。在你的最后一段中,你拼错了“如果你真的想要一个唯一的[…]散列,你应该使用一个HMAC的现有实现”哦,不。如果你想要一个唯一的、伪duorandom 2^128项的长循环,你可以使用可逆的加密/解密算法(AES或其他)这保证了在128位递增ID上的双射。如果您只是想要不时发生冲突的东西,请使用HMAC。很抱歉,我看不到循环。您似乎建议使用块密码来获得0到2^128-1之间的随机数字排列。如果您需要的是排列,这很好,但是这个排列n几乎不可能是2^128个循环。没错,没有循环。你可以随时重置加密的数字。在上一段中,你拼错了“如果你真的想要唯一的[…]散列”,你应该使用现有的HMAC实现”不,如果你想要一个独特的,伪duorandom 2^128项的长周期,你可以使用可逆加密/解密