XFile

关于XFile XFile架构 利用XFile打造家用文件服务系统 移动端应用 开发历史 下    载 授    权 联系我们
   

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,因此它一般只用来防止网络劫持篡改.

 

 

 

 

 

 

 
(c) 2015-2022 phoenixp2p.com