gpt4 book ai didi

java - Git 如何如此快速地计算 SHA 哈希值?

转载 作者:行者123 更新时间:2023-12-01 06:49:35 35 4
gpt4 key购买 nike

我知道 git 很快,但我最近才发现它到底有多快。

在我的一个项目中,我试图计算一个大文件(82 MB,850k 行)的 SHA-256 哈希值,计算它花了一分钟多的时间(包括哈希和其他一些小操作)。

即使使用 SHA-1,我也花了 30 多秒,而 git 似乎只需一两秒即可完成。

我正在使用 java 的 Security API 通过组合文件的所有行来计算 Scala 中的哈希值。

val lines = Source.fromFile(filePath, "UTF-8").getLines().toList
MessageDigest.getInstance("SHA-256")
.digest(lines.mkString("\n").getBytes).map("%02x".format(_)).mkString

那么,Git 是如何做到如此快的,或者更重要的问题是,为什么我的方法这么慢?

编辑:对于那些不熟悉 scala 语法的人,lines 将在 List 中包含文件的所有行,并且 mkString 方法返回列表中所有元素与给定分隔符组合的字符串。

最佳答案

重新发布我之前的评论(扩展)。

你所做的是:

  1. 读取字节
  2. 将它们转换为字符
  3. 将字符流拆分为行
  4. 将这些行存储到列表中
  5. 再次将这些行连接成一个字符串
  6. 再次获取字节
  7. 计算这些字节的哈希值

步骤 2-6 似乎没有必要。我建议从您的初始 FileInputStream 中读取字节成 block (例如 4k)并将它们提供给 MessageDigest用于更新。这只会执行步骤 1 和 7。

InputStream is = new FileInputStream(fileName);
byte[] buffer = new byte[4096];
while (true) {
int read = is.read(buffer);
if (read < 0) {
break;
}
md.update(buffer, 0, read);
}
is.close(); // better be done in finally

至于 sha1 性能,这是我从 time sha1sum <file> 获得的结果其中文件大小为 179Mb:

real    0m0.607s
user 0m0.588s
sys 0m0.016s

关于java - Git 如何如此快速地计算 SHA 哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43102412/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com