哪个更好:sha1_file(f)或sha1(file_get_contents(f))?

Rah*_*hul 4 php hash sha

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

Method 1: sha1_file($file)
Method 2: sha1(file_get_contents($file))
Run Code Online (Sandbox Code Playgroud)

我尝试过10 Mb,但性能没有太大差异. 但是在更高的数据规模上.什么是更好的方式去?

use*_*740 7

除非有令人信服的理由,否则请使用提供的最高级别的表格.

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

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


1sha1_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);
}
Run Code Online (Sandbox Code Playgroud)

通过使用更高级别的函数,适当实现的责任放在库的开发人员身上.在这种情况下,它允许使用缩放流实现.