在ossphpsdk進行crc64校驗
背景
- 使用oss php sdk上傳下載檔案時為了確保資料的一致性,可以使用crc64校驗,與使用md5相比,crc64可以便上傳/下載邊校驗。oss是同時支援這兩種校驗的
- 總所周知,php計算能力弱的特徵,本文章還提供一種在php中嵌入c程式碼實現crc64校驗演算法,以大幅提升上傳下載效能
使用php實現crc64檢驗演算法
<?php
/**
* @return array
*/
function crc64Table()
{
$crc64tab = [];
// ECMA polynomial
$poly64rev = (0xC96C5795 << 32) | 0xD7870F42;
//printf("poly:%x
", $poly64rev);
// ISO polynomial
// $poly64rev = (0xD8 << 56);
for ($n = 0; $n < 256; $n++)
{
$crc = $n;
for ($k = 0; $k < 8; $k++) {
if ($crc & 1 === 1 ) {
$crc = ($crc >> 1) & ~(0x8 << 60) ^ $poly64rev;
} else {
$crc = ($crc >> 1) & ~(0x8 << 60);
}
}
$crc64tab[$n] = $crc;
}
return $crc64tab;
}
/**
* @param string $string
* @param string $format
* @return mixed
* Formats:
* crc64(`php`); // afe4e823e7cef190
* crc64(`php`, `0x%x`); // 0xafe4e823e7cef190
* crc64(`php`, `0x%X`); // 0xAFE4E823E7CEF190
* crc64(`php`, `%d`); // -5772233581471534704 signed int
* crc64(`php`, `%u`); // 12674510492238016912 unsigned int
*/
function crc64 ($crc, $string)
{
static $crc64tab;
if ($crc64tab === null) {
$crc64tab = crc64Table();
}
for ($i = 0; $i < strlen($string); $i++) {
$crc = ~$crc;
$crc = $crc64tab[($crc ^ ord($string[$i])) & 0xff] ^ (($crc >> 8) & ~(0xff << 56));
$crc = ~$crc;
}
return $crc;
}
printf("%u
", crc64(1, "12345678"));
?>
function crc64 ($crc, $string)支援邊上傳邊校驗, 但由於php是在不擅長做計算密集型的工作(如果這個也算的話),加上校驗會拖慢上傳/下載將近10倍,沒有實際應用的價值。可以選用c實現演算法在嵌入php中執行。
php嵌入c語言的方法
方法概述:用c語言實現crc64校驗演算法生成一個.so的動態庫放到php可以呼叫的路徑
- 用C開發PHP擴充套件的時候如果用動態連結庫的方式編譯擴充套件模組,需要用到phpize. phpize -v 一下檢視下有沒有安裝。
沒有安裝phpize的話, ubutun下apt-get install php5-dev - 根據自己的php版本下載php原始碼(可以用php -v檢視php版本), 例如你的php版本是5.4.12,要下載版本號為5.4.xx的php原始碼, 比如我的php版本為5.4.32, 以此版本為例。
- 下載php原始碼
wget http://museum.php.net/php5/php-5.4.32.tar.gz - 解壓
tar zxvf php-5.4.32.tar.gz - cd php-5.4.32/ext
./ext_skel –extname=crc64 - cd crc64
vim crc64.c
在 const zend_function_entry crc64_functions[] = {中增加
PHP_FE(crc64_sum, NULL)
在PHP_FUNCTION(confirm_crc64_compiled)上面增加下面程式碼
PHP_FUNCTION(crc64_sum)
{
char *data;
int data_len;
char *init_crc64;
int init_crc64_len;
char result[100];
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &init_crc64, &init_crc64_len, &data, &data_len) == FAILURE) {
return;
}
crc64_init_once();
crc64(init_crc64, data, result, data_len);
RETURN_STRINGL(result, strlen(result), 1);
}
- 對php7來說, RETURN_STRINGL由三個引數改為兩個引數, 如果你的是php7, 上句為 RETURN_STRINGL(result, strlen(result));
vim ./php_crc64.h
找到PHP_FUNCTION(confirm_crc64_compiled); 在上面新增一行
PHP_FUNCTION(crc64_sum);
- 把oss提供的c語言實現的crc64程式碼拷貝到當前目錄下
cp crc64_ecma.c ./ - vim config.m4
找到PHP_ARG_ENABLE這一行, 把這行及下面兩行的註釋去掉。dnl就是註釋的意思,修改後如下:
PHP_ARG_WITH(crc64, for crc64 support,
Make sure that the comment is aligned:
[ --with-crc64 Include crc64 support])
找到PHP_NEW_EXTENSION這行,修改後如下:
PHP_NEW_EXTENSION(crc64, crc64.c crc64_ecma.c, $ext_shared)
phpize
./configure
make
sudo make install
依次執行後可以檢查一下, 這三個命令後會生成一個crc64.so檔案並安裝到 $extension_dir中,可以用 php -i | grep extension_dir 找到擴充套件目錄。對於我這裡就是/usr/lib64/php/modules目錄, ll /usr/lib64/php/modules/crc64.so 果然在裡面。
- vim /etc/php.ini
找到 ; Dynamic Extensions, 在下面新增一行:
extension=crc64.so
這樣整個php嵌入c語言就完成了。使用php -m檢驗下成果, 發現crc64出現在模組列表中,這說明php嵌入c動態庫成功。
- 開啟oss php sdk crc64校驗的開關
vim samples/Common.php
找到$ossClient = new OssClient… 這行, 增加兩個引數, 修改後如下:
$ossClient = new OssClient(self::accessKeyId, self::accessKeySecret, self::endpoint, false, NULL, true);
這樣sample下的示例就會開啟crc64校驗進行上傳或下載。
相關文章
- 在WSRR 6.2 中使用治理策略框架進行WS-I 校驗框架
- 使用Moya庫,進行https證書校驗HTTP
- pt-table-checksum進行主從資料校驗
- 行式填報 資料校驗 --- 小計校驗
- SpringBoot如何優雅的進行引數校驗Spring Boot
- AntD框架上傳檔案前校驗資訊:選擇檔案前進行內容校驗並提示框架
- Node 在 Controller 層如何進行資料校驗Controller
- Spring AOP @PathVariable和@RequestParam 引數進行校驗(valid)Spring
- 封裝axios請求並對提交引數進行校驗封裝iOS
- SpringBoot介面 - 如何優雅的對引數進行校驗?Spring Boot
- 奇偶校驗(轉換二進位制、bitset)
- springMVC:校驗框架:多規則校驗,巢狀校驗,分組校驗;ssm整合技術SpringMVC框架巢狀SSM
- 前端使用bcrypt對密碼加密,伺服器對密碼進行校驗前端密碼加密伺服器
- 在Linux Shell程式中進行身份驗證(轉)Linux
- 提高你的Java程式碼質量吧:使用valueof前必須進行校驗Java
- MerkleTree在資料校驗上的應用
- 測試開發專題:如何在spring-boot中進行引數校驗Springboot
- 技術分享 | 使用 sync_diff_inspector 對兩個 MySQL 進行資料校驗MySql
- spring-boot 使用hibernate validation對引數進行優雅的校驗Springboot
- 教你用Excel進行語音校對Excel
- CRC校驗原理
- 資料校驗
- 分組校驗
- .NET Attribute在資料校驗上的應用
- 豐富實踐體驗 人工智慧走進校園人工智慧
- 在.Net Web Api中使用FluentValidate進行引數驗證WebAPI
- OpenCV + Dlib對人臉位置進行校準OpenCV
- 前端資料校驗後,後端介面是否需要再次校驗?前端後端
- SpringBoot分組校驗及自定義校驗註解Spring Boot
- 一百行js程式碼實現一個校驗工具JS
- 用Servlet進行使用者名稱和密碼校驗Servlet密碼
- 改進你的資料校驗 -- Value Object Validate 模式 (轉)Object模式
- JS 校驗非法字串JS字串
- eslint 校驗去除EsLint
- easypoi資料校驗
- CRC的校驗原理
- 淺談奇偶校驗
- AOP 無感校驗