前些天问了一个问题下在又有一个问题在使用md5确认的过程中, 一段一段buf确认md5的值
但是这样做能够保证整体的完整性吗如果不能:
如果在文件传输完毕后 对整个文件取md5值,那么需要在系统内开一个很大的buffer
这样有很大的问题哦希望指教

解决方案 »

  1.   

    crc32??内存映射有没有具体的说明呢
      

  2.   

    如果每一段的Offset, length及hash一致的话,就可以保证文件的完整性。
      

  3.   

    楼主对md5太不了解了,“md5确认的过程中, 一段一段buf确认md5的值”这个只是md5的计算过程,最后得到的值才是整个文件的 md5 值,凭什么不能“保证整体的完整性”呢?正是因为可以这样分段计算,才用不着“开一个很大的buffer”。你可以用个比较小的文件,比如 10k 大小的试一试,按 1k 分段和 10k 一次性计算看看,结果一不一样。
      

  4.   

    如果每一段的Offset, length及hash一致的话,就可以保证文件的完整性。多谢DentistryDoctor(不在无聊中无奈,就在沉默中变态)如果这样我只需要:
    我的包里面只有总的长度, 现在要加上总的长度属性, 
    然后接收的时候判断length_before+offset与length_current是否相等.这样做保证了传输过程中不会有错误而且完整现在我还担心的是
    会不会有这样的情况发生;buffer我收到了, 但是我自己fwrite出错了
    这样文件也是坏了, 不知道我这样的担心有没有必要
      

  5.   

    to myy() 
    比如 10k 大小的试一试,按 1k 分段和 10k 一次性计算看看,结果一不一样。但是我每次加密的buffer数据不同啊
    比如下面这个文件
    a.txt
    aaaabbbbccccdddd我分成4段
    aaaa
    bbbb
    cccc
    dddd
    我对每段的加密不一样啊还有对
    aaaabbbbccccdddd的加密结果与前面的也不一样啊------------------
    可能没有理解你的意思
    可以详细说说吗
      

  6.   

    to 楼主:我不知道你用的是谁写的md5算法,rfc标准的 md5 算法用法类似下面这样:  MD5_CTX        context;
      unsigned char  buffer[1024], digest[16];  //初始化
      MD5Init (&context);  //循环读取文件并计算
      while (0!=(len = fread (buffer, 1, 1024, fp)))
        MD5Update (&context, buffer, len);  //计算结束
      MD5Final (&context, digest);
      ...
     
      //最后,digest 中就是 最终的 md5 ,即 fp 文件的 md5,要显示为hex字符还要转换下。
      

  7.   

    to myy
    openssl的MD5(,,) 哦^_^
    我懂你的意思了, 谢谢哦
    你说的对不过现在我想通过内存映射来打开文件,库因为文件很大
    我想道理是一样的.
    多谢我现在在找内存映射的资料