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

有人将 xxhash 投入生产应用吗?用来校验文件唯一性,是否可靠 ?还有没有其它方法?

  •  
  •   cat · 3 小时 38 分钟前 · 240 次点击
    有几十万张图片和视频需要去重,日后会持续增加,之前测了 md5 和 sha1 ,虽然也能接受但还是希望更快一些
    Cursor 告诉我可以用 xxhash ,测了一下性能确实提升了几十倍,但据说碰撞率比 md5/sha1 更高一些

    想问问有没有大佬有没有遇到碰撞的情况?

    另外由于有的视频非常大,受限于磁盘性能,无论 md5 sha1 还是 xxhash 都要浪费很多时间
    看到了很多取若干个点进行采样的处理方式,来提升效率

    想问问这类处理方式,对照片/视频这类文件,碰撞率如何?

    PS. 文件来源都是可靠的,不存在恶意碰撞的情况
    6 条回复    2024-11-25 17:50:16 +08:00
    fangpeishi
        1
    fangpeishi  
       3 小时 22 分钟前
    如果重复率不高,可以考虑先用弱 checksum 算法(例如 adler-32 )走一遍,碰撞了再用强算法走一遍(例如 md5 ,sha1 )。参考 rsync 的做法。
    processzzp
        2
    processzzp  
       3 小时 19 分钟前
    对于你的用途,xxhash3 够了,放心用,还不放心的话就对重复文件再算一遍 SHA-256 或者 SHA3-256 ,绝对保险
    tool2dx
        3
    tool2dx  
       3 小时 17 分钟前
    对视频进行关键帧去重呗,全量读取肯定慢,改啥算法都没用。
    lsylsy2
        4
    lsylsy2  
       3 小时 16 分钟前
    都是取舍,换哈希或者采样都是牺牲碰撞率来换取性能。
    解决方法很简单:先用快的来,如果发现碰撞了,再只对有重复的算一遍 sha1
    cat
        5
    cat  
    OP
       3 小时 4 分钟前
    @fangpeishi @processzzp @lsylsy2 好主意,我怎么忘了这招,先快的来一遍,碰撞了再换准确性更高的
    pxiphx891
        6
    pxiphx891  
       2 小时 2 分钟前
    首先,如果两个文件 size 不一样,这两个文件一定不相同,因此可以先根据 size ,做一个 map ;
    其次,同一个 size 下的,图片有一个「感知哈希算法」,可以算出一个 64 位向量;
    如果 size 相同,向量也相同,再算个 md5 ,就行了

    如果是视频,可以用 ffmpeg 提取 10 个 I 帧出来,再比较
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 11:53 · PVG 19:53 · LAX 03:53 · JFK 06:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.