XFile文件校验计算说明
XFile
从2020.07版本[2.08]开始,在服务器端和客户端提供专业级的文件校验计算功能,分别是全文校验和快速校验,之中,全文校验采用的是标准SHA-256算法,您可以使用7-Zip等携带的文件校验工具进行对比校验,可以得到相同的校验结果,全文校验非常耗费服务器的cpu和磁盘io,开销非常大,如果遇到大量的并发文件校验指令,可能会导致服务器cpu满载.
此外我们还提供了快速校验,快速校验是针对那些不是非常重要的文件,比如视频等,它通过只计算文件头部,中间和结尾各1MB的内容,得出一个sha256校验值,这个校验方法的本身是为了避免文件在传输过程中被劫持,而设计的快速校验方法,对服务器的压力非常小,但是它无法覆盖整个文件,使用全文校验还是快速校验,取决于您的使用环境和文件是否重要,对非常重要的文件,在下载或者备份到服务器前,正确的次序是,先使用我们的程序或者app或者远程得到服务器所在文件的文件校验,然后再执行文件下载或者备份,最后再次计算新文件的校验,这样可以在一定程序避免因为内存翻转可能导致的错误,如果先传输再先后对本地和服务器文件进行校验,由于系统缓冲可能受到内存翻转的错误影响,因此相对前一种方法要存在一点风险,下面的伪代码说明我们是如何计算快速校验的。
快速校验计算方法:
如果文件的长度小于等于3*1024*1024 ,也就是<=3MB ,
那么直接使用标准SHA-256进行全文计算,并返回该结果
如果文件的长度大于3*1024*1024,也就是>3MB
<1>
SHA256_CTXStruct ctx;
sha256_init(&ctx);
首先获取文件的长度,例如ifilesize ,确保该长度大于3*1024*1024
注意,文件头从0开始读
然后分配缓冲1MB, unsigned char *
p=(unsigned char *)malloc(1024*1024);
从文件头读取1MB内容 iread=fread((void
*)p,1,1024*1024,fp);
然后执行SHA256计算
sha256_update(&ctx,p,iread);
<2>
文件指针[读取位置]移动到文件长度除以2然后减去512*1024
FSeek(fp,(ifilesize/2 - 512*1024),SEEK_SET);
继续读取1MB内容 iread=fread((void
*)p,1,1024*1024,fp);
然后执行SHA256计算
sha256_update(&ctx,p,iread);
<3>
文件指针[读取位置]移动到文件结尾倒退 1024*1024
FSeek(fp,-1024*1024,SEEK_END);
继续读取1MB内容 iread=fread((void
*)p,1,1024*1024,fp);
然后执行SHA256计算
sha256_update(&ctx,p,iread);
<4>
计算完成 sha256_final(&ctx,mu.b);
这就是我们整个快速校验算法,无论文件有多大,计算的数据始终是3MB,因此它一般只用来防止网络劫持篡改.
|
|