简短的问题
如何在 PHP 中“恢复hash_context ”?
背景与现状
该软件的目标是逐块(同步)接收大文件,计算该文件的 MD5 和 SHA1 并生成(完整文件的)下载链接。类似 rapidshare 但不是完全发送文件,而是逐块发送文件。
目前该软件正在使用这个逻辑:
它在每个文件会话中同步接收文件块(一个大文件的 10MB 块)。收到所有块后,我需要计算文件的 MD5 和 SHA1,这对于超过 1GB 的文件需要很长时间。
文件终结器的伪代码(收到所有块时):
$fileKey = $_GET['KEY'];
$ctxMd5 = hash_init('md5');
$ctxSha1 = hash_init('sha1');
$fh = fopen('file/containing/all_chunks.tmp', 'r');
while(!feof($fh)) {
$data = fread($fh, CHUNK_SIZE);
hash_update($ctxMd5, $data);
hash_update($ctxSha1, $data);
}
$md5 = hash_final($ctxMd5);
$sha1= hash_final($ctxSha1);
saveFileHashes($fileKey, $md5, $sha1);
问题是当所有块都被上传时,用户必须等到脚本计算出两个哈希值,这非常令人沮丧。
问题的解决方案
我想以这种方式更改接收逻辑:
我不想在接收和保存所有块时计算哈希,而是想恢复或创建新的哈希上下文,增加上下文,保存哈希上下文状态并保存文件块,收到每个块时。
块接收器的伪代码:
$chunkData = getIncommingChunkData();
$fileKey = $_GET['KEY'];
$ctxMd5 = resumeMd5HasingContext($fileKey);
$ctxSha1 = resumeSha1HasingContext($fileKey);
hash_update($ctxMd5, $chunkData);
hash_update($ctxSha1, $chunkData);
saveMd5HashingContext($fileKey, $ctxMd5)
saveSha1HashingContext($fileKey, $ctxSha1)
appendFileChunk($fileKey, $chunkData);
问题
主要问题是 PHP 资源不可序列化,hash_init 也没有提供恢复上下文的方法。
我想知道如何实现上述所有内容?