iOS - 获取文件的MD5

这篇文章,我们来获取一下文件的MD5。此方法主要用于文件比对,比如云空间上传文件时,需要提前判断文件之前是否存在于与空间之上。

1、MD5的简介

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3MD4
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1RIPEMD以及Haval等。(注:sha-1下章博客我们再说)。

2、获取文件的MD5 - 直接上代码
//
//  ViewController.m
//  ToReport
//
//  Created by 司小文 on 2017/12/28.
//  Copyright © 2017年 司小文. All rights reserved.
//

#import "ViewController.h"
#include <CommonCrypto/CommonDigest.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"agree@3x" ofType:@"png"];
    NSString *str_MD5 = [self md5HashOfPath:filePath];
    NSLog(@"xxx = %@",str_MD5);
    
}

#pragma mark 获取文件MD5标签
- (NSString *)md5HashOfPath:(NSString *)path
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // Make sure the file exists
    if( [fileManager fileExistsAtPath:path isDirectory:nil] )
    {
        NSData *data = [NSData dataWithContentsOfFile:path];
        unsigned char digest[CC_MD5_DIGEST_LENGTH];
        CC_MD5( data.bytes, (CC_LONG)data.length, digest );
        
        NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        
        for( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++ )
        {
            [output appendFormat:@"%02x", digest[i]];
        }
        
        return output;
    }
    else
    {
        return @"";
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end


3、加密字符串 - MD5

#pragma mark MD5加密 - input:需要加密的字符串
+(NSString *)md5Encryption:(NSString *)input {
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return  output;
}


如果需要验证 可以去http://www.atool.org/file_hash.php 和代码结果进行对比。


感谢观看,学以致用更感谢!



MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,用于生成文件或数据的固定长度摘要,通常用作数据完整性校验或唯一标识。在C++中,你可以使用第三方库如`openssl`、`boost`或者自定义实现来处理MD5。 1. OpenSSL库:C++中使用OpenSSL计算MD5可以通过`ssl::md5`函数或者`SHA256_CTX`类,它提供了API来初始化、更新和最终获取哈希值。 ```cpp #include <openssl/md5.h> // ... std::string md5sum(const std::string& filename) { MD5_CTX ctx; unsigned char hash[MD5_DIGEST_LENGTH]; FILE* file = fopen(filename.c_str(), "rb"); if (file) { MD5_Init(&ctx); fread(hash, sizeof(unsigned char), sizeof(hash), file); MD5_Final(hash, &ctx); fclose(file); std::stringstream ss; for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]); return ss.str(); } return "Error opening file"; } ``` 2. Boost库:如果你使用Boost库,`boost::uuids::detail::md5`函数也支持MD5计算。 ```cpp #include <boost/uuid/detail/md5.hpp> // ... std::string md5sum(const std::string& filename) { boost::uuids::detail::md5_CTX ctx; boost::uuids::detail::md5_init(&ctx); std::ifstream file(filename, std::ios::binary); if (file) { char buffer[4096]; while (file.read(buffer, sizeof(buffer))) boost::uuids::detail::md5_update(&ctx, buffer, file.gcount()); boost::uuids::detail::md5_finish(&ctx); std::vector<unsigned char> hash = boost::uuids::detail::md5_get_digest(ctx); std::stringstream ss; for (unsigned char c : hash) ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(c); return ss.str(); } return "Error opening file"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值