dev-null-dweller 님의 답변은 갈 길입니다.
- 그것은 지금 정확히
hash_file()
보다 동일한 결과를 제공합니다
그러나 hash_file('crc32b', $filename);
의 메모리 효율적인 PHP4의 백 포트를 찾고있는 사람들을 위해, 여기에 몇 가지 개선과 this PHP manual comment 기반으로하는 솔루션이며,
- 32 비트 & 64 비트 아키텍처를 지원합니다.
경고 : 개는 추합니다. 개선하려고 노력 중입니다.
참고 : 저는 zaf의 주석에서 C 소스 코드를 기반으로 한 솔루션을 시도했지만 PHP로 이식하기에 충분히 신속하게 성공하지 못했습니다.
if (!function_exists('hash_file'))
{
define('CRC_BUFFER_SIZE', 8192);
function hash_file($algo, $filename, $rawOutput = false)
{
$mask32bit = 0xffffffff;
if ($algo !== 'crc32b')
{
trigger_error("Unsupported hashing algorightm '".$algo."'", E_USER_ERROR);
exit;
}
$fp = fopen($filename, 'rb');
if ($fp === false)
{
trigger_error("Could not open file '".$filename."' for reading.", E_USER_ERROR);
exit;
}
static $CRC32Table, $Reflect8Table;
if (!isset($CRC32Table))
{
$Polynomial = 0x04c11db7;
$topBit = 1 << 31;
for($i = 0; $i < 256; $i++)
{
$remainder = $i << 24;
for ($j = 0; $j < 8; $j++)
{
if ($remainder & $topBit)
$remainder = ($remainder << 1)^$Polynomial;
else
$remainder = $remainder << 1;
$remainder &= $mask32bit;
}
$CRC32Table[$i] = $remainder;
if (isset($Reflect8Table[$i]))
continue;
$str = str_pad(decbin($i), 8, '0', STR_PAD_LEFT);
$num = bindec(strrev($str));
$Reflect8Table[$i] = $num;
$Reflect8Table[$num] = $i;
}
}
$remainder = 0xffffffff;
while (!feof($fp))
{
$data = fread($fp, CRC_BUFFER_SIZE);
$len = strlen($data);
for ($i = 0; $i < $len; $i++)
{
$byte = $Reflect8Table[ord($data[$i])];
$index = (($remainder >> 24) & 0xff)^$byte;
$crc = $CRC32Table[$index];
$remainder = (($remainder << 8)^$crc) & $mask32bit;
}
}
$str = decbin($remainder);
$str = str_pad($str, 32, '0', STR_PAD_LEFT);
$remainder = bindec(strrev($str));
$result = $remainder^0xffffffff;
return $rawOutput ? strrev(pack('V', $result)) : dechex($result);
}
}
crc32를 계산할 외부 도구를 알고 있습니까? 나는 리눅스에있다. (Debian Flavor.) – Arshdeep
여기에 대한 소스 코드 : http://www.csbruce.com/~csbruce/software/crc32.c – zaf
@zaf - 멋지게 일했다 ** 별 ** – Arshdeep