![]() | 1 SErHo 2016-10-02 13:51:45 +08:00 md5(x) = x ?? 估计只能穷举了。 |
![]() | 2 techmoe 2016-10-02 13:53:19 +08:00 via Android 如何创造一只从自己下的蛋里孵出来的母鸡? |
![]() | 3 Tink PRO 求高手 |
![]() | 4 Tink PRO 很好玩的问题 |
![]() | 5 shiji 2016-10-02 14:01:03 +08:00 via Android |
![]() | 6 300 2016-10-02 14:01:21 +08:00 via Android 我还想过一个压缩文件的密码是它本身的 md5 值(ω*) |
7 watara 2016-10-02 14:03:08 +08:00 @winterbells 一样,我也想过这个 |
![]() | 8 crs0910 2016-10-02 14:05:04 +08:00 via iPhone 先随便找一个文件计算 md5 值,然后把文件内容修改成改值并保存,因为唯一性,该文件 md5 值肯定会变化,继续改成变化后的值,理论上重复无数次都得不到一致的文件 |
11 jhdxr 2016-10-02 14:26:06 +08:00 @crs0910 『唯一性』这三个字从哪冒出来的? md5 的取值范围是 32 位大小写不敏感的英文数字,是有限的。无限域到有限域的映射,怎么可能唯一 |
12 RqPS6rhmP3Nyn3Tm 2016-10-02 14:42:49 +08:00 MD5 值域是有限的,而数据的可能性是无限的,所以 MD5 必然碰撞。 但是由于文本本身就是一个 MD5 ,它的值域也变得有限了。 所以可能有也可能没有。 |
![]() | 13 maskerTUI 2016-10-02 14:47:18 +08:00 可以试试百度: MD5 碰撞。 |
![]() | 14 codecrash 2016-10-02 16:02:49 +08:00 via Android 也许可以加一些其他的内容来调节文件的 md5 值,使他和我们想要的一样 |
![]() | 15 liuyi_beta 2016-10-02 18:09:52 +08:00 MD5 具有很强的扩散性,任何一个字节的改变都会产生雪崩效应,使得最后生成的 MD5 值和改变前的 MD5 值差别很大,所以只能一次次地去更改,然后碰撞出这样一个结果 |
![]() | 16 nodin 2016-10-02 18:27:09 +08:00 via Android 如何让一个不为零的数加一等于他本身。 |
17 imlonghao673 2016-10-02 18:29:04 +08:00 via Android |
![]() | 18 upczww 2016-10-02 19:35:29 +08:00 via Smartisan T1 这难道不是一个悖论么? |
![]() | 19 imNull 2016-10-02 19:44:14 +08:00 看看这个电影《前目的地》 |
![]() | 20 ldbC5uTBj11yaeh5 2016-10-02 19:48:48 +08:00 via Android |
22 DiamondbacK 2016-10-02 19:53:07 +08:00 @BXIA 这个论证有问题。就算是两个无限集,也未必相交。 |
23 CYKun 2016-10-02 19:55:07 +08:00 ![]() @shiji 翻译了一下你给的第一个问答: 因为 MD5 校验和是 128 位长的,所以不动点(译注:也就是 MD5 值等于自身的字符串)也应该是 128 位的。假设任意字符串的 MD5 校验和是连续随机分布的,那么任意给定的 128 位字符串是一个 MD5 不动点的概率是 1/2^128 。 因此,不存在 128 位的不动点的概率是 (1 - 1/2^128)^(2^128),所以存在不动点的概率是 1 - (1 - 1/2^128)^(2^128)。 因为当 n 趋向与无穷大时,(1 - 1/n)^n = 1/e ,而 2^128 是一个很大的数,所以这个概率差不多就是 1 - 1/e ≈ 63.21%。 当然,这个问题的答案肯定不是随机的这个不动点要么存在要么不存在。但是,我们可以 63.21%地确信存在一个这样的字符串。(还有,注意这个数字跟键空间的大小无关不管 MD5 校验和是 32 位的还是 1024 位的,这个答案都是一样的,只要它比 4 或 5 为长就行了) |
24 CYKun 2016-10-02 20:02:56 +08:00 @jigloo ``` estimated time left: 2.01760719973e+36 hours estimated time left: 8.40669666555e+34 days estimated time left: 2.3032045659e+32 years Traceback (most recent call last): File "md5.py", line 35, in <module> pps = (num-lastnum)/ (nowtime.total_seconds()-lasttime.total_seconds()) ZeroDivisionError: float division by zero ``` 233 |
![]() | 25 Exin 2016-10-03 00:55:28 +08:00 可以加一个限定条件:如何创建一个*内容长度最短*的文本文件... 这样结果就是唯一的 |
26 RqPS6rhmP3Nyn3Tm 2016-10-03 02:39:34 +08:00 via iPhone @DiamondbacK 你说的是哪个?我指的是有限集投射到有限集,所以结论是可能有可能没有啊 |
![]() | 27 bao3 2016-10-03 03:31:34 +08:00 via Android 楼主这个议题似乎跟薛定谔的猫一个道理,在你没有写入 MD5 前,你怎么知道它的内容。 |
28 DiamondbacK 2016-10-03 07:08:01 +08:00 @BXIA 一个函数是否为单射 (是否存在碰撞),与这个函数是否存在不动点 (楼主的问题),是两个不相干的问题。 令函数 f 定义域为 {1, 2, 3}, f(1) = 2 f(2) = 1 f(3) = 1 这不是一个单射,但仍然没有不动点。这样的例子还有 f(x) = |x| + delta f(x) = x^2 + 1/4 + delta f(x) = sin(x), x != 0 其中 delta > 0 。它们都没有不动点,而且只要在适当的定义域下 (既可以有限也可以无限),它们都不是单射。 **一般地**,设 A 、 B 为任意非空集合,其中 |B| > 1 , g 是一个函数,它的定义域为 A 。对任意 x 属于 A ,令 g(x) 属于 B - { x }。这样构造出来的函数 g ,值域就是 B 的子集,但是 g 没有不动点。 这表明,无论给定什么样的定义域,无论值域多么小,只要不是一个单元素集合,函数都可以没有不动点。 |
29 RqPS6rhmP3Nyn3Tm 2016-10-03 07:22:09 +08:00 @DiamondbacK 你说得很对。是我搞错了 |
![]() | 30 shuson 2016-10-03 09:43:29 +08:00 |
![]() | 34 hundan 2016-10-03 11:13:53 +08:00 x=md5(x) 大概是这样吗- - |
![]() | 38 billion OP @liqingcan 你的这个思路不对啊。因为你的代码不涉及文件操作,你没有办法知道保存了 md5 值的这个文本文件的 md5 值是多少。 |
![]() | 42 wintercoder 2017-06-04 23:38:19 +08:00 |
43 Vizogood 2017-06-05 04:50:37 +08:00 via iPhone |