V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
billion
V2EX  ›  问与答

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

  •  
  •   billion · 2016-10-02 13:43:45 +08:00 · 6722 次点击
    这是一个创建于 2734 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 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  
       2016-10-02 13:53:40 +08:00 via iPhone
    求高手
    Tink
        4
    Tink  
       2016-10-02 13:53:57 +08:00 via iPhone
    很好玩的问题
    winterbells
        6
    winterbells  
       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
    看看这个电影《前目的地》
    jigloo
        20
    jigloo  
       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 千万条数据,还在跑。[传送门]( https://www.v2ex.com/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   ·   我们的愿景   ·   实用小工具   ·   1193 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:17 · PVG 07:17 · LAX 16:17 · JFK 19:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.