2023-05-14 18:24:01 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare (strict_types=1);
|
2024-01-02 02:40:38 +00:00
|
|
|
namespace Rector\Util;
|
2023-05-14 18:24:01 +00:00
|
|
|
|
2024-01-02 02:40:38 +00:00
|
|
|
use Rector\Exception\ShouldNotHappenException;
|
2023-05-14 18:24:01 +00:00
|
|
|
/**
|
2024-01-01 09:05:02 +00:00
|
|
|
* @see \Rector\Tests\Util\FileHasherTest
|
2023-05-14 18:24:01 +00:00
|
|
|
*/
|
|
|
|
final class FileHasher
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* cryptographic insecure hasing of a string
|
|
|
|
*/
|
|
|
|
public function hash(string $string) : string
|
|
|
|
{
|
|
|
|
return \hash($this->getAlgo(), $string);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* cryptographic insecure hasing of files
|
|
|
|
*
|
|
|
|
* @param string[] $files
|
|
|
|
*/
|
|
|
|
public function hashFiles(array $files) : string
|
|
|
|
{
|
|
|
|
$configHash = '';
|
|
|
|
$algo = $this->getAlgo();
|
|
|
|
foreach ($files as $file) {
|
|
|
|
$hash = \hash_file($algo, $file);
|
|
|
|
if ($hash === \false) {
|
|
|
|
throw new ShouldNotHappenException(\sprintf('File %s is not readable', $file));
|
|
|
|
}
|
|
|
|
$configHash .= $hash;
|
|
|
|
}
|
|
|
|
return $configHash;
|
|
|
|
}
|
|
|
|
private function getAlgo() : string
|
|
|
|
{
|
|
|
|
//see https://php.watch/articles/php-hash-benchmark
|
|
|
|
if (\PHP_VERSION_ID >= 80100) {
|
|
|
|
// if xxh128 is available use it, as it is way faster
|
|
|
|
return 'xxh128';
|
|
|
|
}
|
|
|
|
return 'md4';
|
|
|
|
}
|
|
|
|
}
|