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 2016-10-02 13:53:40 +08:00 via iPhone
求高手
|
4
Tink 2016-10-02 13:53:57 +08:00 via iPhone
很好玩的问题
|
5
shiji 2016-10-02 14:01:03 +08:00 via Android
|
6
winterbells 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 1
@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)
大概是这样吗- - |
37
liqingcan 2016-10-04 21:00:47 +08:00
挺有意思的,写了一段 python 脚本验证一下,跑了快 4 千万条数据,还在跑。[传送门]( https://www.v2ex.com/t/310571)
|
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
|