如何创建一个文本文件,里面的内容是它自己的 MD5 值? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
billion
V2EX    问与答

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

  •  
  •   billion 2016-10-02 13:43:45 +08:00 7280 次点击
    这是一个创建于 3298 天前的主题,其中信息可能已经有所发展或是发生改变。
    第 1 条附言    2016-10-02 17:38:46 +08:00
    如果有 V 友可以贴出代码,那就最好了~
    43 条回复    2017-06-05 04:50:37 +08:00
    SErHo
        1
    SErHo  
       2016-10-02 13:51:45 +08:00
    md5(x) = x ?? 估计只能穷举了。
    techmoe
        2
    techmoe  
       2016-10-02 13:53:19 +08:00 via Android
    如何创造一只从自己下的蛋里孵出来的母鸡?
    Tink
        3
    Tink  
    PRO
       2016-10-02 13:53:40 +08:00 via iPhone
    求高手
    Tink
        4
    Tink  
    PRO
       2016-10-02 13:53:57 +08:00 via iPhone
    很好玩的问题
    300
        6
    300  
       2016-10-02 14:01:21 +08:00 via Android
    我还想过一个压缩文件的密码是它本身的 md5 值(ω*)
    watara
        7
    watara  
       2016-10-02 14:03:08 +08:00
    @winterbells 一样,我也想过这个
    crs0910
        8
    crs0910  
       2016-10-02 14:05:04 +08:00 via iPhone
    先随便找一个文件计算 md5 值,然后把文件内容修改成改值并保存,因为唯一性,该文件 md5 值肯定会变化,继续改成变化后的值,理论上重复无数次都得不到一致的文件
    skydiver
        9
    skydiver  
       2016-10-02 14:08:45 +08:00
    @crs0910 如果有不动点的话,也许就收敛了
    crs0910
        10
    crs0910  
       2016-10-02 14:16:33 +08:00 via iPhone
    @skydiver 数学不好,胡乱想的 你的意思是我的这个例子并不能穷举所有的 md5 是吧
    jhdxr
        11
    jhdxr  
       2016-10-02 14:26:06 +08:00
    @crs0910 『唯一性』这三个字从哪冒出来的? md5 的取值范围是 32 位大小写不敏感的英文数字,是有限的。无限域到有限域的映射,怎么可能唯一
    RqPS6rhmP3Nyn3Tm
        12
    RqPS6rhmP3Nyn3Tm  
       2016-10-02 14:42:49 +08:00
    MD5 值域是有限的,而数据的可能性是无限的,所以 MD5 必然碰撞。
    但是由于文本本身就是一个 MD5 ,它的值域也变得有限了。
    所以可能有也可能没有。
    maskerTUI
        13
    maskerTUI  
       2016-10-02 14:47:18 +08:00
    可以试试百度: MD5 碰撞。
    codecrash
        14
    codecrash  
       2016-10-02 16:02:49 +08:00 via Android
    也许可以加一些其他的内容来调节文件的 md5 值,使他和我们想要的一样
    liuyi_beta
        15
    liuyi_beta  
       2016-10-02 18:09:52 +08:00
    MD5 具有很强的扩散性,任何一个字节的改变都会产生雪崩效应,使得最后生成的 MD5 值和改变前的 MD5 值差别很大,所以只能一次次地去更改,然后碰撞出这样一个结果
    nodin
        16
    nodin  
       2016-10-02 18:27:09 +08:00 via Android
    如何让一个不为零的数加一等于他本身。
    imlonghao673
        17
    imlonghao673  
       2016-10-02 18:29:04 +08:00 via Android
    先随便定义这个文本文件,然后修改一些地方做碰撞

    参考: /t/169241
    upczww
        18
    upczww  
       2016-10-02 19:35:29 +08:00 via Smartisan T1
    这难道不是一个悖论么?
    imNull
        19
    imNull  
       2016-10-02 19:44:14 +08:00
    看看这个电影《前目的地》
    ldbC5uTBj11yaeh5
        20
    ldbC5uTBj11yaeh5  
       2016-10-02 19:48:48 +08:00 via Android
    billion
        21
    billion  
    OP
       2016-10-02 19:49:25 +08:00 via iPad
    @imNull 早就看过了。
    DiamondbacK
        22
    DiamondbacK  
       2016-10-02 19:53:07 +08:00
    @BXIA
    这个论证有问题。就算是两个无限集,也未必相交。
    CYKun
        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 为长就行了)
    CYKun
        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
    Exin
        25
    Exin  
       2016-10-03 00:55:28 +08:00
    可以加一个限定条件:如何创建一个*内容长度最短*的文本文件...

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

    这表明,无论给定什么样的定义域,无论值域多么小,只要不是一个单元素集合,函数都可以没有不动点。
    RqPS6rhmP3Nyn3Tm
        29
    RqPS6rhmP3Nyn3Tm  
       2016-10-03 07:22:09 +08:00
    @DiamondbacK 你说得很对。是我搞错了
    shuson
        30
    shuson  
       2016-10-03 09:43:29 +08:00
    azh7138m
        31
    azh7138m  
       2016-10-03 10:13:39 +08:00 via Android
    @Exin
    > 里面的内容是它自己的 MD5 值
    Exin
        32
    Exin  
       2016-10-03 10:15:52 +08:00 via iPhone
    @azh7138m 有什么问题?
    azh7138m
        33
    azh7138m  
       2016-10-03 10:34:23 +08:00
    @Exin 咋变短...长度是确定的:|
    hundan
        34
    hundan  
       2016-10-03 11:13:53 +08:00
    x=md5(x)
    大概是这样吗- -
    Exin
        35
    Exin  
       2016-10-03 11:15:52 +08:00
    @azh7138m 我搞错了。想说“最小”来着
    billion
        36
    billion  
    OP
       2016-10-03 14:01:22 +08:00 via iPad
    @hundan 是的。但是左边的 x 是保存在文本中的字符串,右边是对这个文本文件的 md5
    liqingcan
        37
    liqingcan  
       2016-10-04 21:00:47 +08:00
    挺有意思的,写了一段 python 脚本验证一下,跑了快 4 千万条数据,还在跑。[传送门]( t/310571)
    billion
        38
    billion  
    OP
       2016-10-05 00:06:29 +08:00
    @liqingcan 你的这个思路不对啊。因为你的代码不涉及文件操作,你没有办法知道保存了 md5 值的这个文本文件的 md5 值是多少。
    liqingcan
        39
    liqingcan  
       2016-10-05 00:36:12 +08:00
    @billion 我用之前做了一下测试,我将字符串直接计算 md5 和放进文件计算 MD5 计算结果是一样的
    billion
        40
    billion  
    OP
       2016-10-05 09:33:17 +08:00
    @liqingcan 放进文件以后计算文件的 MD5 值?
    liqingcan
        41
    liqingcan  
       2016-10-05 10:23:45 +08:00
    @billion 恩,放进文件以后直接用 2345 好压的 md5 计算工具计算
    wintercoder
        42
    wintercoder  
       2017-06-04 23:38:19 +08:00
    Vizogood
        43
    Vizogood  
       2017-06-05 04:50:37 +08:00 via iPhone
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3159 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 12:19 PVG 20:19 LAX 05:19 JFK 08:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86