昨晚梦到自己发了一篇很短很短的论文,整个论文的价值就只有一个等式
MD5(x)===x
是的,在梦里我发现了一个128bit的MD5不动点。
当然,这目前也只能存在我的梦里。因为找到一个MD5不动点是一件非常非常非常困难的事情,想要MD5(x)===x 成立,那么能知道信息是x一定是128bit的长度,总空间是2^128,也就是约3.4x10^38。假设全球人类人手一部 iPhone 17 Pro Max,一起算,也需要接近270亿亿年才可能找到。而目前宇宙的年龄推测才138亿年,所以《我是宇宙,重生就为了算MD5不动点》也得拍195亿部才能看到大结局。
在梦里论文发表之前我想了很多办法来证明这是自己发现的,因为这个东西,一旦发布出来,所谓的难度就坍缩下来了,成为了一条谁都可以拥有并且可以验证的信息。
我先想到的是ZK Proof,我把Proof进行SHA256后发布到微博。也把SHA256(MD5(x))发布到微博。一环套一环,360度无死角全部进行一个时间戳认证,证明这就是我自己发现的。
论文发表之后,各种声音都有,有些人觉得不就是一串数据,也没啥用。有些人就觉得这个发现很有意义,各种吵闹。还有人认为,找到不动点可能不重要,但这个人怎么找到的可能是一件很重要的事情,于是把我抓起来拷问了。
﹥
微博正文我以前也好奇过MD5的环和不动点,而找环与找不动点的算法其实是可以用一套的,如果找到的环长度是1那么这就是一个不动点。不管是找到了环还是不动点,都不亏。
但以前跑过一段时间的找环脚本,有很多“缺陷”。首先我太贪心了,直接去找128bit的。第二是为了能判断环的存在,选择了缓存所有路径的办法,内存开销极大。
所以今天打算继续找环。目标截断到64bit,根据生日悖论来说搜索空间约42.9亿次,我的电脑应该是能跑出来的。但即便是截断到64bit,如果缓存所有的路径,理论上需要32GB的内存,而用Python跑的话实际开销可能达到128GB或更多。
我非常需要一种办法,可以不缓存所有的路径还能判断出环的存在。请教了下Gemini,还是有收获的,学到了一种叫“快慢指针(Floyd’s Cycle Finding Algorithm)”的办法。原理是只缓存快慢两个指针,假如存在环,那么快指针一定会有追上慢指针的时刻。类似在环形跑道上的龟兔赛跑。
内存是狠狠地省下了,但快慢指针的代价是什么呢?我觉得是滞后性,因为判断成环的条件是快指针跑完一圈追上慢指针,假如这个环的长度非常非常长,那么为了“追上”慢指针,就需要更多的计算步数。
按照瑞利分布,我有99%的可能性,能在440分钟内找到一个MD5按64bit截断的环。