Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1

发布于 1周前 作者 sinazl 来自 Go语言

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


Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1
22 回复

git 有硬件加速吧

更多关于Golang Go语言中为什么我用go写的sha-1计算没有git的快速sha-1的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我用 sha1sum 算一个 1.4G 的花的时间是 5 秒,其实我理解相当多时间是在等磁盘读取
你这个 30-40 秒估计很有优化空间

路过问一下现代文件系统有没有文件 hash 的接口? 只使用少量 IO 就能获得文件 hash.

显然是你自己不会用
1 个 g 的文件要 30-40 秒, 开什么玩笑

阁下为何不 show code 呢

试了一下 go 也只需要 1-2 秒。你贴一下你的 go 代码。

这种常见的劣化方案就是大量申请的临时空间,临时变量用完就丢,一直在申请和释放内存就慢,

go 不是很擅长并发么,现代多核处理器加 ssd 的组合,不至于这么慢吧,1g 左右的文件大小,1-3s 属于比较正常的范畴,检查下缓冲区跟异步并发这两块?

不会是你自己实现的吧?如果你不懂任何优化,至少照着算法山寨一个,30s 很正常。

不知道怎么修改回复……“至少”=>“只是”。

你写的程序有问题,SHA-1 在现代 CPU 上不用硬件加速也能跑几百兆每秒,git 算 SHA-1 的性能完全就是合理水平。

既然你是 go 用户,那为什么不看看 go 标准库里的实现呢?手写的汇编,广泛验证的质量,详实的注释,连参考文章都列的清清楚楚。完全值得一看。

show your go code

现代 CPU 支持 CPU 指令直接计算 sha ,不过即使软解也没那么慢,你代码问题
https://en.m.wikipedia.org/wiki/Intel_SHA_extensions

代码发出来看看

代码啊代码

这东西咋并发?

sha 应该不可以,如果是 crc 支持 update ,就可以用并行

“sha 不可以”和我理解的一样,hash 类的计算都有前后依赖

不过 crc 这个我没听懂。主要是我也不懂 crc ,所以缺乏理解你这句话的基础知识




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®
}

{ // 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())
}
}

在Golang中,如果你发现自己用Go语言编写的SHA-1计算没有Git的快速,这通常是由几个关键因素导致的:

  1. 算法实现与优化:Git作为一个高度优化的版本控制系统,其内部的SHA-1实现经过了大量的性能调优。相比之下,自行编写的SHA-1算法可能缺乏这些优化,比如内存访问模式、指令级并行等。

  2. 库的选择:Go标准库中的crypto/sha1提供了SHA-1的实现,但可能不是最高效的。一些第三方库,如crypto/sha1asm(如果可用),可能提供了更快的实现。此外,硬件加速(如使用CPU的SHA指令集)也能显著提高性能。

  3. 输入数据处理:如果你的代码在SHA-1计算之前对输入数据进行了额外的处理(如读取、转换格式等),这些步骤可能成为性能瓶颈。确保输入数据以最高效的方式提供给SHA-1算法。

  4. 并发与并行:Git可能利用了多核处理器的优势,通过并行处理多个文件或数据块来加速SHA-1计算。如果你的代码是单线程的,考虑使用Go的并发特性(如goroutines)来加速处理。

为了提高你的SHA-1计算速度,你可以尝试使用优化过的库、确保输入数据的高效处理、以及利用Go的并发特性。同时,也要意识到SHA-1因其安全性问题已被广泛弃用,对于新的项目或安全敏感的应用,建议使用更安全的哈希算法,如SHA-256或SHA-3。

回到顶部