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

从F到0 - From F to 0

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

[PHP/ASP/JSP] 异或表达式实现计算数据/字符串的CRC64算法 兼容32位/64位PHP (返回大写16进制字符串)

[复制链接]
发表于 2023-6-20 11:29:06 | 显示全部楼层 |阅读模式
1.png
  1. <?php

  2. function crc64_xor($i,$d){                //CRC64异或表达式 严禁修改
  3. $x[0]=$d[0]^$i[0];$x[1]=$d[2]^$i[2];$x[2]=$d[3]^$i[3];$x[3]=$d[6]^$i[6];
  4. $x[4]=$d[7]^$i[7];$x[5]=$d[4]^$i[4];$x[6]=$d[5]^$i[5];$x[7]=$d[1]^$i[1];
  5. $x[8]=$x[2]^$x[1];$x[9]=$x[4]^$x[0];$x[10]=$x[5]^$x[3];$x[11]=$x[7]^$x[6];
  6. $x[12]=$x[9]^$x[6];$x[13]=$x[10]^$x[8];$x[14]=$x[11]^$x[3];$x[15]=$x[5]^$x[0];
  7. $x[16]=$x[7]^$x[2];$x[17]=$x[9]^$x[1];$x[18]=$x[8]^$x[4];$x[19]=$x[12]^$x[8];
  8. $x[20]=$x[3]^$x[0];$x[21]=$x[6]^$x[1];$x[22]=$x[9]^$x[5];$x[23]=$x[10]^$x[0];
  9. $x[24]=$x[13]^$x[4];$x[25]=$x[5]^$x[2];$x[26]=$x[8]^$x[0];$x[27]=$x[11]^$x[8];
  10. $x[28]=$x[13]^$x[12];$x[29]=$x[15]^$x[6];$x[30]=$x[17]^$x[3];$x[31]=$x[17]^$x[10];
  11. $x[32]=$x[18]^$x[14];$x[33]=$x[0]^$i[10];$x[34]=$x[1]^$i[8];$x[35]=$x[1]^$i[12];
  12. $x[36]=$x[1]^$i[54];$x[37]=$x[1]^$i[62];$x[38]=$x[2]^$i[23];$x[39]=$x[2]^$i[43];
  13. $x[40]=$x[2]^$i[61];$x[41]=$x[3]^$i[15];$x[42]=$x[3]^$i[16];$x[43]=$x[3]^$i[33];
  14. $x[44]=$x[3]^$i[35];$x[45]=$x[4]^$i[40];$x[46]=$x[4]^$i[52];$x[47]=$x[5]^$i[21];
  15. $x[48]=$x[5]^$i[36];$x[49]=$x[5]^$i[55];$x[50]=$x[5]^$x[4];$x[51]=$x[6]^$i[56];
  16. $x[52]=$x[6]^$i[57];$x[53]=$x[7]^$i[11];$x[54]=$x[7]^$i[41];$x[55]=$x[7]^$i[42];
  17. $x[56]=$x[7]^$i[53];$x[57]=$x[7]^$i[63];$x[58]=$x[8]^$i[13];$o[19]=$x[8]^$i[27];
  18. $x[59]=$x[8]^$i[37];$x[60]=$x[8]^$x[7];$x[61]=$x[9]^$i[9];$x[62]=$x[9]^$i[32];
  19. $x[63]=$x[9]^$i[50];$x[64]=$x[9]^$i[58];$x[65]=$x[9]^$x[2];$x[66]=$x[10]^$i[60];
  20. $x[67]=$x[11]^$i[44];$x[68]=$x[11]^$x[0];$x[69]=$x[12]^$x[3];$o[22]=$x[14]^$i[30];
  21. $o[38]=$x[14]^$i[46];$x[70]=$x[15]^$i[22];$x[71]=$x[16]^$i[14];$o[58]=$x[16]^$x[10];
  22. $o[26]=$x[18]^$i[34];$o[11]=$x[19]^$i[19];$o[18]=$x[19]^$i[26];$o[56]=$x[19]^$x[5];
  23. $o[43]=$x[20]^$i[51];$o[51]=$x[22]^$i[59];$x[72]=$x[23]^$x[7];$o[30]=$x[24]^$i[38];
  24. $o[40]=$x[24]^$i[48];$o[62]=$x[24]^$x[11];$o[20]=$x[25]^$i[28];$o[12]=$x[26]^$i[20];
  25. $o[57]=$x[26]^$x[6];$o[60]=$x[27]^$x[15];$o[10]=$x[28]^$i[18];$o[17]=$x[28]^$i[25];
  26. $o[21]=$x[29]^$i[29];$o[37]=$x[29]^$i[45];$o[23]=$x[30]^$i[31];$o[39]=$x[30]^$i[47];
  27. $o[9]=$x[31]^$i[17];$o[16]=$x[31]^$i[24];$o[31]=$x[32]^$i[39];$o[41]=$x[32]^$i[49];
  28. $o[2]=$x[33]^$x[2];$o[4]=$x[35]^$x[11];$o[46]=$x[36]^$x[12];$o[54]=$x[37]^$x[4];
  29. $o[15]=$x[38]^$x[14];$o[35]=$x[39]^$x[23];$o[7]=$x[41]^$x[6];$o[8]=$x[42]^$x[9];
  30. $o[25]=$x[43]^$x[19];$o[32]=$x[45]^$x[16];$o[44]=$x[46]^$x[7];$o[13]=$x[47]^$x[16];
  31. $o[28]=$x[48]^$x[18];$o[47]=$x[49]^$x[8];$o[59]=$x[50]^$x[21];$o[48]=$x[51]^$x[25];
  32. $o[49]=$x[52]^$x[23];$o[3]=$x[53]^$x[15];$o[33]=$x[54]^$x[20];$o[34]=$x[55]^$x[17];
  33. $o[45]=$x[56]^$x[10];$o[55]=$x[57]^$x[13];$o[5]=$x[58]^$x[20];$o[29]=$x[59]^$x[14];
  34. $o[27]=$x[60]^$x[44];$o[1]=$x[61]^$x[27];$o[24]=$x[62]^$x[13];$o[42]=$x[63]^$x[16];
  35. $o[50]=$x[64]^$x[14];$o[63]=$x[65]^$x[11];$o[52]=$x[66]^$x[21];$o[36]=$x[67]^$x[22];
  36. $o[61]=$x[68]^$x[13];$o[53]=$x[69]^$x[40];$o[14]=$x[70]^$x[21];$o[6]=$x[71]^$x[22];
  37. $o[0]=$x[72]^$x[34];
  38. return $o;
  39. }

  40. function crc64($data){                //计算数据CRC64值 (兼容32位/64位PHP,返回大写16进制字符串)
  41.         $crc = array();
  42.         $d = array();
  43.         $a = array(
  44.                 '0000' => '0','0001' => '1','0010' => '2','0011' => '3',
  45.                 '0100' => '4','0101' => '5','0110' => '6','0111' => '7',
  46.                 '1000' => '8','1001' => '9','1010' => 'A','1011' => 'B',
  47.                 '1100' => 'C','1101' => 'D','1110' => 'E','1111' => 'F'
  48.         );
  49.         for($i=0;$i<64;$i++){
  50.                 array_push($crc,1);
  51.         }
  52.         $len = strlen($data);
  53.         for($i=0;$i<$len;$i++){
  54.                 $j = ord($data[$i]);
  55.                 for($k=0;$k<8;$k++){
  56.                         $d[$k] = ($j & (1<<$k)) ? 1 : 0;
  57.                 }
  58.                 $crc = crc64_xor($crc,$d);
  59.         }
  60.         $k = 0;
  61.         $ret = '';
  62.         for($i=0;$i<16;$i++){
  63.                 $m = '';
  64.                 for($j=0;$j<4;$j++){
  65.                         $m .= $crc[$k++^3] ? 0 : 1;
  66.                 }
  67.                 $ret = $a[$m].$ret;
  68.         }
  69.         return $ret;
  70. }

  71. echo crc64("Hello World! 中文测试 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
  72. ?>
复制代码

相关帖子

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

本版积分规则

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

腾讯云安全认证

GMT+8, 2024-4-27 15:49 , Processed in 1.275073 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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