美文网首页
iOS 文件MD5

iOS 文件MD5

作者: kindom_0129 | 来源:发表于2017-02-17 11:31 被阅读0次

一般我们在使用http或者socket上传或者下载文件的时候,经常会在完成之后经行一次MD5值得校验(尤其是在断点续传的时候用的更
多),校验MD5值是为了防止在传输的过程当中丢包或者数据包被篡改,在使用MD5之前呢我们应该先了解MD5的一些常识。MD5 百度百科

需要引用:#include <CommonCrypto/CommonDigest.h>

#define FileHashDefaultChunkSizeForReadingData 1024*8
CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,size_t chunkSizeForReadingData) {
    // Declare needed variables
    CFStringRef result = NULL;
    CFReadStreamRef readStream = NULL;
    // Get the file URL
    CFURLRef fileURL =
    CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                  (CFStringRef)filePath,
                                  kCFURLPOSIXPathStyle,
                                  (Boolean)false);
    if (!fileURL) goto done;
    // Create and open the read stream
    readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,
                                            (CFURLRef)fileURL);
    if (!readStream) goto done;
    bool didSucceed = (bool)CFReadStreamOpen(readStream);
    if (!didSucceed) goto done;
    // Initialize the hash object
    CC_MD5_CTX hashObject;
    CC_MD5_Init(&hashObject);
    // Make sure chunkSizeForReadingData is valid
    if (!chunkSizeForReadingData) {
        chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
    }
    // Feed the data to the hash object
    bool hasMoreData = true;
    while (hasMoreData) {
        uint8_t buffer[chunkSizeForReadingData];
        CFIndex readBytesCount = CFReadStreamRead(readStream,(UInt8 *)buffer,(CFIndex)sizeof(buffer));
        if (readBytesCount == -1) break;
        if (readBytesCount == 0) {
            hasMoreData = false;
            continue;
        }
        CC_MD5_Update(&hashObject,(const void *)buffer,(CC_LONG)readBytesCount);
    }
    // Check if the read operation succeeded
    didSucceed = !hasMoreData;
    // Compute the hash digest
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(digest, &hashObject);
    // Abort if the read operation failed
    if (!didSucceed) goto done;
    // Compute the string result
    char hash[2 * sizeof(digest) + 1];
    for (size_t i = 0; i < sizeof(digest); ++i) {
        snprintf(hash + (2 * i), 3, "%02x", (int)(digest[i]));
    }
    result = CFStringCreateWithCString(kCFAllocatorDefault,(const char *)hash,kCFStringEncodingUTF8);
    
done:
    if (readStream) {
        CFReadStreamClose(readStream);
        CFRelease(readStream);
    }
    if (fileURL) {
        CFRelease(fileURL);
    }
    return result;
}

#pragma mark - class method

+(NSString*)getFileMD5WithPath:(NSString*)path
{
    return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
}

相关文章

  • IOS中的加密方式MD5、sha512

    title : IOS中的加密方式MD5、sha512category : IOS .h文件 .m文件

  • 文件下载的安全性

    1、文件下载时需要核查其md5值 1)流程: 2)实现: 2、iOS - 获取文件MD5 : 示例代码链接:htt...

  • iOS中使用MD5加密

    在iOS中使用MD5加密较简单,需要引入头文件CommonCrypto/CommonDigest.h,我们单独新建...

  • Python使用Md5的姿势

    一、计算String的Md5 二、计算文件的Md5 三、计算小文件的Md5

  • iOS 文件MD5

    一般我们在使用http或者socket上传或者下载文件的时候,经常会在完成之后经行一次MD5值得校验(尤其是在断点...

  • Mac 修改文件MD5值

    1、查看文件的MD5值 打开终端,键入 MD5 文件地址 2、修改文件的MD5值 在1的步骤下,键入...

  • swift 文件 MD5

    swift 文件 MD5 import CommonCrypto /* * 文件的MD5 */ func md5F...

  • Mac 利用终端命令查看MD5/SHA1/SHA256

    Mac系统中的终端可以通过命令查看文件或者字符串的MD5值等。 查看文件MD5: 查看字符串MD5: 查看文件SH...

  • 【MD5】多文件生成md5

    如何针对多个文件生成一个md5, 本文记录操作方式,进行备忘 生成多文件md5 1.生成所有文件的md5值 服务端...

  • Android数据加密

    MD5加密算法实现: 1.计算字符串MD5值 2.计算文件的MD5值 // 计算文件的 MD5 值 3.采用nio...

网友评论

      本文标题:iOS 文件MD5

      本文链接:https://www.haomeiwen.com/subject/xshhwttx.html