设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2953|回复: 1
收起左侧

[PHP/ASP/JSP] 64位PHP实现计算1个大文件的CRC64哈希散列摘要校验值 crc64_file() 函数

[复制链接]
发表于 2019-5-28 12:19:42 | 显示全部楼层 |阅读模式

  1. <?php
  2. define('CRC64_TABLE',crc64_table());        //不支持32位PHP否则会出错

  3. function crc64_table(){                //初始化CRC64表格
  4.     $return = array();
  5.         for($n=0;$n<256;$n++){
  6.                 $crc = $n;
  7.                 for($k=0;$k < 8;$k++){
  8.                         $crc = ($crc >> 1) & PHP_INT_MAX ^ ($crc&1 ? -3932672073523589310 : 0);
  9.                 }
  10.         $return[$n] = $crc;
  11.     }
  12.     return $return;
  13. }


  14. //分段计算CRC64 参数1:数据 参数2:CRC64计算结果变量
  15. function crc64_segment($data,&$crc){
  16.         $j = ~(0xff << 56);
  17.         $len = strlen($data);
  18.         for($i = 0; $i < $len; $i++){
  19.                 $crc = CRC64_TABLE[($crc ^ ord($data[$i])) & 0xff] ^ (($crc >> 8) & $j);
  20.     }
  21. }

  22. /*
  23.         计算1个文件的CRC64值 (成功返回正负数值,失败返回NAN)
  24.         参数1:文件名 (文件路径)
  25.         参数2:缓存大小字节 (留空默认1Mb,不影响计算结果)
  26. */
  27. function crc64_file($file_name,$cache_size = 1048576){
  28.         $crc = - 1;
  29.         if($cache_size < 1) return NAN;
  30.         $file = @fopen($file_name,'r');
  31.         if(!$file) return NAN;
  32.         $len = filesize($file_name);

  33.         do {
  34.                 $cache = fread($file,$cache_size);
  35.                 $len -= $cache_size;
  36.                 crc64_segment($cache,$crc);
  37.         } while($len > 0);
  38.         fclose($file);
  39.         return ~$crc;
  40. }


  41. $crc = crc64_file("data.bin");
  42. echo $crc."<br>";

  43. printf("%X",$crc);
  44. ?>
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-19 21:41 , Processed in 0.623036 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表