读取 hashing/checksums 的大部分文件
Reading large portions of files for hashing/checksums
如果我有三个get参数:
$filename = $_GET['filename'];
$start = $_GET['start'];
$size = $_GET['size'];
我正在读取文件的一大块,如下所示:
$handle = fopen($basepath . $filename, "rb");
fseek($handle, $start);
$contents = fread($handle, $size);
echo md5($contents);
我如何读取文件的大部分(从 1mb 到 1gb 的任意位置)并创建其内容的散列或校验和,而无需为整个读取分配足够的内存?
目前,如果我尝试散列太大的文件部分,我会收到内存错误,因为 php 无法分配足够的内存(大约 400mb)。
是否有一个哈希函数,我可以在其中一次消化部分文件而不是一次消化全部内容(例如从 $start
开始读取 100kb 块并提供它直到满足 $size
为止)?我将如何分块读取文件,以便从 $start
开始并读取 $size
字节?
如果没有这样的散列函数或校验和函数支持一次馈送数据块,是否可以file_get_contents()
解决为大读取分配内存的问题? 我不完全确定该功能是如何工作的。
谢谢。
http://php.net/manual/en/function.hash-update.php
<?php
define('CHUNK', 65536);
//$file = 'alargefile.img';
//$start = 256 * 1024 * 1024;
//$size = 512 * 1024 * 1024;
$fp = fopen($file, "r");
fseek($fp, $start);
$ctx = hash_init('md5');
while ($size > 0) {
$buffer = fread($fp, min($size, CHUNK));
hash_update($ctx, $buffer);
$size -= CHUNK;
}
$hash = hash_final($ctx);
fclose($fp);
print $hash;
?>
如果我有三个get参数:
$filename = $_GET['filename'];
$start = $_GET['start'];
$size = $_GET['size'];
我正在读取文件的一大块,如下所示:
$handle = fopen($basepath . $filename, "rb");
fseek($handle, $start);
$contents = fread($handle, $size);
echo md5($contents);
我如何读取文件的大部分(从 1mb 到 1gb 的任意位置)并创建其内容的散列或校验和,而无需为整个读取分配足够的内存?
目前,如果我尝试散列太大的文件部分,我会收到内存错误,因为 php 无法分配足够的内存(大约 400mb)。
是否有一个哈希函数,我可以在其中一次消化部分文件而不是一次消化全部内容(例如从 $start
开始读取 100kb 块并提供它直到满足 $size
为止)?我将如何分块读取文件,以便从 $start
开始并读取 $size
字节?
如果没有这样的散列函数或校验和函数支持一次馈送数据块,是否可以file_get_contents()
解决为大读取分配内存的问题? 我不完全确定该功能是如何工作的。
谢谢。
http://php.net/manual/en/function.hash-update.php
<?php
define('CHUNK', 65536);
//$file = 'alargefile.img';
//$start = 256 * 1024 * 1024;
//$size = 512 * 1024 * 1024;
$fp = fopen($file, "r");
fseek($fp, $start);
$ctx = hash_init('md5');
while ($size > 0) {
$buffer = fread($fp, min($size, CHUNK));
hash_update($ctx, $buffer);
$size -= CHUNK;
}
$hash = hash_final($ctx);
fclose($fp);
print $hash;
?>