Git如何快速计算SHA哈希值?

Dur*_*oop 0 java git hash scala sha

我知道git很快但我最近才知道它的速度有多快.

在我的一个项目中,我正在尝试计算一个巨大文件(82 MB,850k行)的SHA-256哈希值,并且花了一分多钟来计算它(包括散列和其他一些小操作).

即使使用SHA-1,它也花了我30多秒,而git似乎只用了一两秒钟.

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

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

那么,Git如何快速地做到这一点,或者说更重要的问题,为什么我的方法如此缓慢?

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

Rom*_*kiy 7

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

你做的是:

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

步骤2-6似乎没必要.我建议从FileInputStream块中的初始块(例如,4k)读取字节并将它们提供给MessageDigestfor update.那只会执行第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
Run Code Online (Sandbox Code Playgroud)

至于sha1性能,这里是我得到的time sha1sum <file>文件是179Mb:

real    0m0.607s
user    0m0.588s
sys 0m0.016s
Run Code Online (Sandbox Code Playgroud)