美文网首页
iOS 获取文件MD5

iOS 获取文件MD5

作者: Bager | 来源:发表于2017-05-18 09:53 被阅读281次
    
    + (NSString*)getFileMD5WithPath:(NSString*)path
    {
        return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
    }
    
    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;
        
    }
    
    

    相关文章

      网友评论

          本文标题:iOS 获取文件MD5

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