Voting

: two minus two?
(Example: nine)

The Note You're Voting On

Lawrence Cherone
7 years ago
It's sometimes necessary to hash the same file with different algos,

<?php
function hash_file_multi($algos = [], $filename) {
if (!
is_array($algos)) {
throw new
\InvalidArgumentException('First argument must be an array');
}

if (!
is_string($filename)) {
throw new
\InvalidArgumentException('Second argument must be a string');
}

if (!
file_exists($filename)) {
throw new
\InvalidArgumentException('Second argument, file not found');
}

$result = [];
$fp = fopen($filename, "r");
if (
$fp) {
// ini hash contexts
foreach ($algos as $algo) {
$ctx[$algo] = hash_init($algo);
}

// calculate hash
while (!feof($fp)) {
$buffer = fgets($fp, 65536);
foreach (
$ctx as $key => $context) {
hash_update($ctx[$key], $buffer);
}
}

// finalise hash and store in return
foreach ($algos as $algo) {
$result[$algo] = hash_final($ctx[$algo]);
}

fclose($fp);
} else {
throw new
\InvalidArgumentException('Could not open file for reading');
}
return
$result;
}
?>

Which would be used like:

<?php
$result
= hash_file_multi(['md5', 'sha1', 'sha256'], 'path/to/file.ext');

var_dump($result['md5'] === hash_file('md5', 'path/to/file.ext')); //true
var_dump($result['sha1'] === hash_file('sha1', 'path/to/file.ext')); //true
var_dump($result['sha256'] === hash_file('sha256', 'path/to/file.ext')); //true

<< Back to user notes page

To Top