我想创建一个文件的哈希值,其大小最小为 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
内容读入内存。随着文件大小的增加和/或系统资源变得有限,这可能会对性能产生非常不利的影响。
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);
}
通过使用更高级的函数,合适的实现的责任就落在了库的开发者身上。在这种情况下,它允许使用缩放流实现。