`
siruoxian
  • 浏览: 237809 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

ios获取文件的MD5值

阅读更多

看到的好东西,留着以后用得着,原文地址:

http://blog.csdn.net/shouqiangwei/article/details/12286503

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

多),校验MD5值是为了防止在传输的过程当中丢包或者数据包被篡改,在使用MD5之前呢我们应该先了解MD5的一些常识。MD5 百度百科

 

简单的来说:

1)、MD5是使用哈希算法计算文件或字符串的摘要,对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。128/ 8 = 16,也就是说MD5得到的是一组16字节长度的八进制。

2)、一般在使用的时候需要将它转换成十六进制输出,并且同时输出为小写。

在有了这些基础知识之后,计算MD5就没有那么大的难度了,最近在做大文件MD5计算的时候在网上搜到了一大堆ios MD5的代码,其中有一大部分都不能用,尤其是 使用

 NSFileHandle*  handle = [NSFileHandle fileHandleForReadingAtPath:_filePath]; 这种方法的,就最坑了,应为它永远读取的是文件的固定的位置,而并不是计算整个文件的MD5摘要,所以永远让你陷入尴尬的境地。例如:(

NSData* fileData = [handle readDataOfLength1024*8]; //永远读取的是从开始位置开始,1024*8长度的文件, 如果使用这种方法的话,必须在每次读取之前将文件读取的位置设置为指定的位置,应该使用NSFileHandle的 - (void)seekToFileOffset:(unsigned long long)offset;

下面贴上我找的能用的一段代码:亲测各个平台同一个计算出来的MD5值相同。(在使用的时候,可能会见

FileHashDefaultChunkSizeForReadingData 未定义的情况,那么你应该显示的在头文件里加入混定义:

#define FileHashDefaultChunkSizeForReadingData 1024*8 

代码如下:

 

+(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 == -1break;

        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;

}

 

 

分享到:
评论

相关推荐

    VC/MFC 获取文件MD5值 获取大文件MD5值

    在VC/MFC(Microsoft Foundation Classes)环境中,获取文件的MD5值是一项常见的任务,尤其是在进行文件完整性检查或对比文件是否相同的时候。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将...

    c++ 读文件的MD5值

    实现C++读取文件MD5值的过程涉及几个关键步骤: 1. **引入库**:首先,你需要引入`&lt;openssl/md5.h&gt;`库,这是OpenSSL库的一部分,提供了MD5计算功能。 2. **初始化MD5上下文**:创建一个MD5上下文对象,调用`MD5_...

    获取文件MD5值

    这段代码首先打开指定路径的文件,然后使用MD5_Init初始化上下文,接着使用MD5_Update逐块读取文件并更新MD5摘要,最后使用MD5_Final计算出最终的MD5值。这个值是一个16字节的二进制数组,我们将其转换为32位的十六...

    IOS获取设备MAC地址及MD5加密

    这些通常是Objective-C类文件,其中`SGMSettingConfig`可能是定义了获取MAC地址和MD5加密的方法的类。在实际项目中,你可能会把这些功能封装到一个单独的类别(Category)或者服务类(Service Class)中,以便在不同...

    MD5算法,求文件的MD5值

    这个`getMD5FromFile`函数读取指定文件,计算其MD5值并返回16进制字符串。注意,实际应用中需要正确处理可能出现的文件读取错误。 在标签中提到的"求值"和"C++",意味着我们需要关注如何在C++环境中使用MD5算法计算...

    vc++获取文件Md5源代码

    本示例提供的源代码是用VC++实现的文件MD5获取功能。MD5计算通常涉及到以下几个关键步骤: 1. **MD5算法原理**:MD5算法由Ronald Rivest在1991年提出,它通过一系列复杂的数学运算(如位移、异或、加法等)将输入...

    C++Check文件MD5值文件上传服务器

    为了对比本地和服务器上的文件MD5值,你需要先从服务器获取文件,然后计算其MD5。这个过程可以通过额外的HTTP请求实现,例如GET请求下载文件,然后再次使用上述的`calculateMD5`函数。 在实际应用中,你可能还需要...

    C++计算MD5值计算机系统为Linux Deepin

    在`main`函数中,你需要提供要计算MD5值的文件路径,然后调用`calculateMD5`函数,打印出结果。 在Linux Deepin上安装`openssl`库可以使用命令`sudo apt-get install libssl-dev`。确保在编译程序时链接这个库,...

    MD5.rar_c md5_md5 文件_md5生成 c++_vc获取MD5_文件md5生成

    在C++中,为了获取文件的MD5值,你需要打开文件,读取其内容,并将内容传递给MD5函数进行计算。对于VC++(Visual C++)环境,可以利用OpenSSL库中的`EVP_DigestInit`, `EVP_DigestUpdate`, 和 `EVP_DigestFinal`函数...

    C++ 文件MD5

    在C++编程中,计算文件的MD5值是常见的需求,比如用于验证文件的完整性和一致性。下面我们将深入探讨如何在C++中实现文件MD5的计算。 首先,我们需要了解MD5的基本原理。MD5算法通过一系列复杂的数学和逻辑运算,将...

    计算文件MD5 c++源码

    总结来说,计算文件的MD5值在C++中主要依赖于第三方库如`openssl`,通过初始化MD5上下文、读取文件内容更新MD5值,最后生成和返回16进制的MD5摘要。注意文件路径的处理和适配不同操作系统的需求,以确保程序的健壮性...

    iOS MD5加密

    这段代码首先将`NSString`转换为UTF8编码的C字符串,然后使用CommonCrypto库中的`CC_MD5`函数计算MD5值。计算结果是一个16字节的数组,然后将其转换为16进制的字符串返回。 总的来说,iOS中的MD5加密涉及到数据安全...

    iOS开发之MD5演练.zip

    对文件进行MD5校验时,需要读取文件内容并计算其MD5值。以下是一个计算文件MD5的示例: ```objc - (NSString *)md5ForFileAtPath:(NSString *)filePath { NSFileManager *fileManager = [NSFileManager ...

    MD5验证的c++代码

    这样,其他模块就可以直接实例化该类并调用接口获取MD5值,提高了代码的可复用性和可维护性。 总结来说,C++中实现MD5验证主要涉及理解MD5算法的工作原理,引入并使用`openssl`库,以及正确地读取文件和处理散列值...

    VS2010 MFC 选择并获得文件的MD5

    这个值可以用来验证文件是否被篡改,因为任何文件内容的微小改变都会导致MD5值的巨大变化。在VS2010的MFC项目中,实现文件选择和MD5计算是常见的需求。 首先,你需要创建一个MFC对话框应用程序,通过`CFileDialog`...

    md.rar_32位 md5 c++_C create MD5_md_md5

    这个过程是单向的,即从原始数据生成MD5摘要很容易,但若从MD5值反推原始数据则极其困难,因此它具有良好的抗篡改性。 在C++中实现MD5,通常需要引入一个库,如OpenSSL库。OpenSSL提供了MD5函数接口,允许开发者...

    MD5动态库封装类

    在实际应用中,你还可以根据需求扩展功能,比如对比两个文件的MD5值以判断它们是否一致,或者将MD5值存储在数据库中以便后续的完整性验证。 需要注意的是,虽然MD5在许多非安全场景下仍可使用,但随着技术的发展,...

    C++生成MD5、SHA1值

    MD5的计算速度快,但因其易受碰撞攻击(即两个不同的输入可能产生相同的MD5值),在安全性要求高的场景下已经不再推荐使用。尽管如此,MD5仍在一些不涉及安全性的校验场景中得到应用,如文件完整性检查。 SHA1是...

    md5计算c++6.0编写

    这个例子中,`calculateMD5`函数接收文件路径,打开文件,逐块读取内容并计算MD5值,最后将16字节的结果转换成16进制字符串返回。 总结来说,C++6.0环境下实现MD5计算可以选择引入第三方库如OpenSSL,或者自行实现...

    md5封装类及调用 vc++

    例如,要计算一个名为`Md5Test`的文件的MD5值,可以这样做: ```cpp CMd5 md5; ifstream file("Md5Test", ios::binary); if (file.is_open()) { char buffer[4096]; while (!file.eof()) { file.read(buffer, ...

Global site tag (gtag.js) - Google Analytics