|
- <?php
- define('CRC64_TABLE',crc64_table()); //不支持32位PHP否则会出错
- function crc64_table(){ //初始化CRC64表格
- $return = array();
- for($n=0;$n<256;$n++){
- $crc = $n;
- for($k=0;$k < 8;$k++){
- $crc = ($crc >> 1) & PHP_INT_MAX ^ ($crc&1 ? -3932672073523589310 : 0);
- }
- $return[$n] = $crc;
- }
- return $return;
- }
- //分段计算CRC64 参数1:数据 参数2:CRC64计算结果变量
- function crc64_segment($data,&$crc){
- $j = ~(0xff << 56);
- $len = strlen($data);
- for($i = 0; $i < $len; $i++){
- $crc = CRC64_TABLE[($crc ^ ord($data[$i])) & 0xff] ^ (($crc >> 8) & $j);
- }
- }
- /*
- 计算1个文件的CRC64值 (成功返回正负数值,失败返回NAN)
- 参数1:文件名 (文件路径)
- 参数2:缓存大小字节 (留空默认1Mb,不影响计算结果)
- */
- function crc64_file($file_name,$cache_size = 1048576){
- $crc = - 1;
- if($cache_size < 1) return NAN;
- $file = @fopen($file_name,'r');
- if(!$file) return NAN;
- $len = filesize($file_name);
- do {
- $cache = fread($file,$cache_size);
- $len -= $cache_size;
- crc64_segment($cache,$crc);
- } while($len > 0);
- fclose($file);
- return ~$crc;
- }
- $crc = crc64_file("data.bin");
- echo $crc."<br>";
- printf("%X",$crc);
- ?>
复制代码
|
|