为什么我用 go 写的 sha-1,计算没有 git 的快速 sha-1 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
pdxjun
V2EX    Go 编程语言

为什么我用 go 写的 sha-1,计算没有 git 的快速 sha-1

  •  
  •   pdxjun 2023-09-08 17:47:59 +08:00 2924 次点击
    这是一个创建于 763 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我计算大概 1 个 g 的文件要 30-40 秒,但是 git 只需要 1-2 秒,有老哥们知道 git 是怎么计算的吗

    第 1 条附言    2023-09-11 10:26:56 +08:00
    最终发现是我写的有问题,小文件太多了,没有处理好,不过我优化了一下,现在已经快多了,不过还是没有 git 的快。。。,但是也能接受了
    21 条回复    2023-09-10 17:07:45 +08:00
    liuidetmks
        1
    liuidetmks  
       2023-09-08 18:01:04 +08:00
    git 有硬件加速吧
    danbai
        2
    danbai  
    PRO
       2023-09-08 18:04:28 +08:00
    clino
        3
    clino  
       2023-09-08 18:12:17 +08:00
    我用 sha1sum 算一个 1.4G 的花的时间是 5 秒,其实我理解相当多时间是在等磁盘读取
    你这个 30-40 秒估计很有优化空间
    shimanooo
        4
    shimanooo  
       2023-09-08 18:16:17 +08:00
    路过问一下现代文件系统有没有文件 hash 的接口? 只使用少量 IO 就能获得文件 hash.
    slowman
        5
    slowman  
       2023-09-08 18:18:01 +08:00
    显然是你自己不会用
    1 个 g 的文件要 30-40 秒, 开什么玩笑
    sardina
        6
    sardina  
       2023-09-08 18:26:03 +08:00 via iPhone
    阁下为何不 show code 呢
    zhy0216
        7
    zhy0216  
       2023-09-08 18:37:51 +08:00 via Android
    Trim21
        8
    Trim21  
       2023-09-08 18:46:31 +08:00
    试了一下 go 也只需要 1-2 秒。你贴一下你的 go 代码。
    AoEiuV020JP
        9
    AoEiuV020JP  
       2023-09-08 19:40:25 +08:00 via Android   1
    这种常见的劣化方案就是大量申请的临时空间,临时变量用完就丢,一直在申请和释放内存就慢,
    ShuWei
        10
    ShuWei  
       2023-09-08 22:10:43 +08:00
    go 不是很擅长并发么,现代多核处理器加 ssd 的组合,不至于这么慢吧,1g 左右的文件大小,1-3s 属于比较正常的范畴,检查下缓冲区跟异步并发这两块?
    kneo
        11
    kneo  
       2023-09-08 22:48:09 +08:00 via Android
    不会是你自己实现的吧?如果你不懂任何优化,至少照着算法山寨一个,30s 很正常。
    kneo
        12
    kneo  
       2023-09-08 22:49:22 +08:00 via Android
    @kneo 不知道怎么修改回复……“至少”=>“只是”。
    nlzy
        13
    nlzy  
       2023-09-09 00:07:32 +08:00 via Android
    你写的程序有问题,SHA-1 在现代 CPU 上不用硬件加速也能跑几百兆每秒,git 算 SHA-1 的性能完全就是合理水平。

    既然你是 go 用户,那为什么不看看 go 标准库里的实现呢?手写的汇编,广泛验证的质量,详实的注释,连参考文章都列的清清楚楚。完全值得一看。
    flyqie
        14
    flyqie  
       2023-09-09 08:22:03 +08:00 via Android
    show your go code
    qwerthhusn
        15
    qwerthhusn  
       2023-09-09 09:33:05 +08:00 via iPhone
    现代 CPU 支持 CPU 指令直接计算 sha ,不过即使软解也没那么慢,你代码问题
    https://en.m.wikipedia.org/wiki/Intel_SHA_extensions
    sadfQED2
        16
    sadfQED2  
       2023-09-09 10:23:33 +08:00 via Android
    代码发出来看看
    lasuar
        17
    lasuar  
       2023-09-09 10:33:34 +08:00
    代码啊代码
    julyclyde
        18
    julyclyde  
       2023-09-10 11:42:55 +08:00
    @ShuWei 这东西咋并发?
    lysS
        19
    lysS  
       2023-09-10 12:02:55 +08:00
    @julyclyde sha 应该不可以,如果是 crc 支持 update ,就可以用并行
    julyclyde
        20
    julyclyde  
       2023-09-10 12:05:29 +08:00
    @lysS “sha 不可以”和我理解的一样,hash 类的计算都有前后依赖

    不过 crc 这个我没听懂。主要是我也不懂 crc ,所以缺乏理解你这句话的基础知识
    lysS
        21
    lysS  
       2023-09-10 17:07:45 +08:00
    @julyclyde


    package main

    import (
    "fmt"
    "hash/crc64"
    "sync"
    )

    func main() {

    var data = []byte{
    1, 2, 3, 4, 5, 6, 7, 8,
    1, 2, 3, 4, 5, 6, 7, 8,
    1, 2, 3, 4, 5, 6, 7, 8,
    }

    iso := crc64.MakeTable(crc64.ISO)

    {
    r := crc64.Checksum(data, iso)
    fmt.Println(r)
    }

    { // concurrent
    crc := crc64.New(iso)
    wg := &sync.WaitGroup{}
    wg.Add(3)

    go func() {
    crc.Write(data[16:24])
    wg.Done()
    }()

    go func() {
    crc.Write(data[0:8])
    wg.Done()
    }()

    go func() {
    crc.Write(data[8:16])
    wg.Done()
    }()

    wg.Wait()
    fmt.Println(crc.Sum64())
    }
    }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     880 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 21:17 PVG 05:17 LAX 14:17 JFK 17:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86