The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
pdxjun

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

  •  
  •   pdxjun · Sep 8, 2023 · 4004 views
    This topic created in 1153 days ago, the information mentioned may be changed or developed.

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

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

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

    不过 crc 这个我没听懂。主要是我也不懂 crc ,所以缺乏理解你这句话的基础知识
    lysS
    lysS
    Sep 10, 2023
    21
    @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())
    }
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3029 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 11:43 · PVG 19:43 · LAX 03:43 · JFK 06:43
    ♥ Do have faith in what you're doing.