哪个更可取:sha1_file(f) 或 sha1(file_get_contents(f))


Which is preferable: sha1_file(f) or sha1(file_get_contents(f))?

我想创建一个文件大小最小为5Mb并可扩展到1-2 Gb的文件哈希。现在,尽管它们的工作方式完全相同,但在这两种方法之间出现了艰难的选择。

Method 1: sha1_file($file)
Method 2: sha1(file_get_contents($file))

我尝试过使用 10 Mb,但性能没有太大区别。但在更高的数据规模上。有什么更好的方法可以走?

除非有令人信服的理由,否则使用提供的最高级形式。

在这种情况下,正确的选择是 sha1_file .因为sha1_file是仅适用于文件的更高级别的功能。这种"限制"允许它利用文件/源可以作为流1 处理的事实:一次只有文件的一小部分被读入内存。

第二种方法保证浪费/使用5MB-2GB的内存(文件大小),因为file_get_contents生成哈希之前将所有内容读入内存。随着文件大小的增加和/或系统资源受到限制,这可能会对性能产生非常不利的影响。


1 sha1_file的来源可以在 github 上找到。以下是仅显示与流处理相关的行的摘录:

PHP_FUNCTION(sha1_file)
{       
    stream = php_stream_open_wrapper(arg, "rb", REPORT_ERRORS, NULL);
    PHP_SHA1Init(&context);    
    while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
        PHP_SHA1Update(&context, buf, n);
    }    
    PHP_SHA1Final(digest, &context);    
    php_stream_close(stream);
}

通过使用更高级别的功能,合适的实现的责任就落在了库的开发人员身上。在这种情况下,它允许使用缩放流实现。