读取 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;
?>