读取大部分文件以进行散列/校验和

时间:2015-10-20 23:39:16

标签: php hash md5 fread

如果我有三个获取参数:

$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()解决为大量读取分配内存的问题吗?我是不完全确定该功能是如何运作的。

感谢。

1 个答案:

答案 0 :(得分:1)

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