如何创建一个文本文件,里面的内容是它自己的 MD5 值?

2016-10-02 13:43:45 +08:00
 billion
7004 次点击
所在节点    问与答
43 条回复
billion
2016-10-02 19:49:25 +08:00
@imNull 早就看过了。
DiamondbacK
2016-10-02 19:53:07 +08:00
@BXIA
这个论证有问题。就算是两个无限集,也未必相交。
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 为长就行了)
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
Exin
2016-10-03 00:55:28 +08:00
可以加一个限定条件:如何创建一个*内容长度最短*的文本文件...

这样结果就是唯一的
RqPS6rhmP3Nyn3Tm
2016-10-03 02:39:34 +08:00
@DiamondbacK 你说的是哪个?我指的是有限集投射到有限集,所以结论是可能有可能没有啊
bao3
2016-10-03 03:31:34 +08:00
楼主这个议题似乎跟薛定谔的猫一个道理,在你没有写入 MD5 前,你怎么知道它的内容。
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 没有不动点。

这表明,无论给定什么样的定义域,无论值域多么小,只要不是一个单元素集合,函数都可以没有不动点。
RqPS6rhmP3Nyn3Tm
2016-10-03 07:22:09 +08:00
@DiamondbacK 你说得很对。是我搞错了
shuson
2016-10-03 09:43:29 +08:00
azh7138m
2016-10-03 10:13:39 +08:00
@Exin
> 里面的内容是它自己的 MD5 值
Exin
2016-10-03 10:15:52 +08:00
@azh7138m 有什么问题?
azh7138m
2016-10-03 10:34:23 +08:00
@Exin 咋变短...长度是确定的:|
hundan
2016-10-03 11:13:53 +08:00
x=md5(x)
大概是这样吗- -
Exin
2016-10-03 11:15:52 +08:00
@azh7138m 我搞错了。想说“最小”来着
billion
2016-10-03 14:01:22 +08:00
@hundan 是的。但是左边的 x 是保存在文本中的字符串,右边是对这个文本文件的 md5
liqingcan
2016-10-04 21:00:47 +08:00
挺有意思的,写了一段 python 脚本验证一下,跑了快 4 千万条数据,还在跑。[传送门]( https://www.v2ex.com/t/310571)
billion
2016-10-05 00:06:29 +08:00
@liqingcan 你的这个思路不对啊。因为你的代码不涉及文件操作,你没有办法知道保存了 md5 值的这个文本文件的 md5 值是多少。
liqingcan
2016-10-05 00:36:12 +08:00
@billion 我用之前做了一下测试,我将字符串直接计算 md5 和放进文件计算 MD5 计算结果是一样的
billion
2016-10-05 09:33:17 +08:00
@liqingcan 放进文件以后计算文件的 MD5 值?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/310259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX