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 · 2470 次点击
    这是一个创建于 440 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我计算大概 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  
       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.
    1423
        5
    1423  
       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   ·   实用小工具   ·   2641 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.