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

有什么常见可靠比 MD5 短的摘要算法?

  •  
  •   nyse · 2018-10-31 11:07:25 +08:00 · 4993 次点击
    这是一个创建于 1996 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个项目,大概就是抓取一些数据,每条数据包含很短的字符串(不超过 200 字)和一些数字。

    现在是通过把这些字符串数字等拼在一起,计算 MD5,存入数据库,以 MD5 作为唯一索引判断是否存在。

    但是感觉 MD5 太长了,占用数据库空间,有没有更短的摘要算法,以减少数据库占用?

    19 条回复    2018-10-31 14:47:47 +08:00
    qwe61655
        1
    qwe61655  
       2018-10-31 11:25:37 +08:00 via iPhone
    要短还要可靠 你不觉得冲突了吗
    creamiced
        2
    creamiced  
       2018-10-31 11:26:31 +08:00   ❤️ 2
    抛个砖:使用 MD5 结果的前几位。
    嫌 MD5 占用空间,是否说明数据量极大,能否接受更短的结果带来的更大的碰撞几率?
    kernel
        3
    kernel  
       2018-10-31 11:26:43 +08:00
    取 md5 一段就行了
    yanaraika
        4
    yanaraika  
       2018-10-31 11:26:46 +08:00
    直接随便找个 digest 算法,取输出前若干位
    Aliencn
        5
    Aliencn  
       2018-10-31 11:27:52 +08:00
    surfire91
        6
    surfire91  
       2018-10-31 11:28:08 +08:00
    如何定义可靠?
    你要多短的?可以看看 CRC。
    imdong
        7
    imdong  
       2018-10-31 11:30:24 +08:00
    那你有多少条数据呢?
    10 条数据的话,md5 截取固定两三位也许就够了。
    如果数据量非常大,我认为 md5 已经不够可靠了。
    e9e499d78f
        8
    e9e499d78f  
       2018-10-31 11:30:29 +08:00 via iPhone
    xxhash 64
    wysnylc
        9
    wysnylc  
       2018-10-31 11:32:18 +08:00
    建议数据库全清,更省
    batter
        10
    batter  
       2018-10-31 11:33:15 +08:00
    再短容易撞吧?
    shoumu
        11
    shoumu  
       2018-10-31 11:36:19 +08:00
    md5 你可以只取 64 位啊,你可以算一下碰撞概率,符合预期还可以取更短的长度
    qq316107934
        12
    qq316107934  
       2018-10-31 11:40:39 +08:00
    md5 可以 binary 化映射到 ASCII 全区域啊,32x16/128=4,四个字符长度足矣
    msg7086
        13
    msg7086  
       2018-10-31 12:50:34 +08:00
    @qq316107934 128bit 16 字节的二进制是怎么算出四个字符的。

    @myse 自己计算一下碰撞概率,算出碰撞空间,转换成 bit 就知道该用什么了。
    这些密码学摘要算法的长度就是碰撞可靠性。缩短长度就是缩短碰撞可靠性。
    如前面所说,每减少 1bit,碰撞空间减半,等于碰撞概率加倍。减少一个字节就是碰撞概率变成原来的 256 倍,md5 切一半就是原来的 2^64 倍。
    glues
        14
    glues  
       2018-10-31 12:58:21 +08:00
    md5 这种过时的东西,居然还有人在用?
    如 12 楼所说的,摘要指不一定非要用 hex,用 ASCII 的话,应该能省点空间
    另外,硬盘白菜价的年代,还在乎这点空间?
    jjianwen68
        15
    jjianwen68  
       2018-10-31 13:03:35 +08:00
    md5 前 4 位后 4 位综合判断是不是就够了
    qq316107934
        16
    qq316107934  
       2018-10-31 14:11:16 +08:00
    @msg7086 #13 不好意思没仔细思考算错了,一个 ASCII 是 8bit,一个 HEX 是 4bit,应该是长度折半。
    geelaw
        17
    geelaw  
       2018-10-31 14:39:59 +08:00 via iPhone   ❤️ 1
    @glues #14 这个场景里并没有 adversarially chosen strings,MD5 属于一种随意的选择。

    回到楼主的问题,如果你把 hash 函数建模为 random oracle,输出长度是 k bits 时,在 2^(k/2) 个 strings 时有常数概率碰撞。一般希望碰撞概率是 negligible,所以可以设置

    k = w(log t) + 2 log N

    其中 N 是数据的个数,t 是安全参数,w 表示严格高阶无穷大。
    zjp
        18
    zjp  
       2018-10-31 14:45:52 +08:00
    md5 取部分不如 CRC16/CRC32
    实际上差不了多少
    jimages
        19
    jimages  
       2018-10-31 14:47:47 +08:00 via iPhone
    布隆过滤器?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5314 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:48 · PVG 16:48 · LAX 01:48 · JFK 04:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.