前段时间偶然发现了几个手机号 MD5 反查网站: https://phonehash.cn/single http://124.221.109.178:5555/ https://tool.ytxsvr.com/md5 第一反应不是查号码,而是好奇:这种服务背后到底是什么实现?把 100 亿个手机号全部算一遍,需要多大的数据库、多少 CPU ,普 通服务器能不能跑? 于是我自己写了一套,从建表、索引到 Web 查询都跑了一遍。 先算最直接的方案 覆盖 10000000000 ~ 19999999999 ,一共是 100 亿个数字。 如果做完整索引,即使不保存完整 MD5 ,只保存截断哈希和 40 bit 的号码编号,每条记录压到 5 字节,最终仍然需要约 47 GiB 。 查询会很快,但为了这么一个工具准备几十 GiB 数据,感觉有点重。 换成彩虹表 后来采用了完美彩虹表,把号码连成一条条长度为 1000 的计算链: 手机号 → MD5 → 归约成新手机号 → MD5 → …… → 终点 数据库不保存中间经过的号码...