看到的好东西,留着以后用得着,原文地址:
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 readDataOfLength: 1024*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 == -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;
}
相关推荐
在VC/MFC(Microsoft Foundation Classes)环境中,获取文件的MD5值是一项常见的任务,尤其是在进行文件完整性检查或对比文件是否相同的时候。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将...
实现C++读取文件MD5值的过程涉及几个关键步骤: 1. **引入库**:首先,你需要引入`<openssl/md5.h>`库,这是OpenSSL库的一部分,提供了MD5计算功能。 2. **初始化MD5上下文**:创建一个MD5上下文对象,调用`MD5_...
这段代码首先打开指定路径的文件,然后使用MD5_Init初始化上下文,接着使用MD5_Update逐块读取文件并更新MD5摘要,最后使用MD5_Final计算出最终的MD5值。这个值是一个16字节的二进制数组,我们将其转换为32位的十六...
这些通常是Objective-C类文件,其中`SGMSettingConfig`可能是定义了获取MAC地址和MD5加密的方法的类。在实际项目中,你可能会把这些功能封装到一个单独的类别(Category)或者服务类(Service Class)中,以便在不同...
这个`getMD5FromFile`函数读取指定文件,计算其MD5值并返回16进制字符串。注意,实际应用中需要正确处理可能出现的文件读取错误。 在标签中提到的"求值"和"C++",意味着我们需要关注如何在C++环境中使用MD5算法计算...
本示例提供的源代码是用VC++实现的文件MD5获取功能。MD5计算通常涉及到以下几个关键步骤: 1. **MD5算法原理**:MD5算法由Ronald Rivest在1991年提出,它通过一系列复杂的数学运算(如位移、异或、加法等)将输入...
为了对比本地和服务器上的文件MD5值,你需要先从服务器获取文件,然后计算其MD5。这个过程可以通过额外的HTTP请求实现,例如GET请求下载文件,然后再次使用上述的`calculateMD5`函数。 在实际应用中,你可能还需要...
在`main`函数中,你需要提供要计算MD5值的文件路径,然后调用`calculateMD5`函数,打印出结果。 在Linux Deepin上安装`openssl`库可以使用命令`sudo apt-get install libssl-dev`。确保在编译程序时链接这个库,...
在C++中,为了获取文件的MD5值,你需要打开文件,读取其内容,并将内容传递给MD5函数进行计算。对于VC++(Visual C++)环境,可以利用OpenSSL库中的`EVP_DigestInit`, `EVP_DigestUpdate`, 和 `EVP_DigestFinal`函数...
在C++编程中,计算文件的MD5值是常见的需求,比如用于验证文件的完整性和一致性。下面我们将深入探讨如何在C++中实现文件MD5的计算。 首先,我们需要了解MD5的基本原理。MD5算法通过一系列复杂的数学和逻辑运算,将...
总结来说,计算文件的MD5值在C++中主要依赖于第三方库如`openssl`,通过初始化MD5上下文、读取文件内容更新MD5值,最后生成和返回16进制的MD5摘要。注意文件路径的处理和适配不同操作系统的需求,以确保程序的健壮性...
这段代码首先将`NSString`转换为UTF8编码的C字符串,然后使用CommonCrypto库中的`CC_MD5`函数计算MD5值。计算结果是一个16字节的数组,然后将其转换为16进制的字符串返回。 总的来说,iOS中的MD5加密涉及到数据安全...
对文件进行MD5校验时,需要读取文件内容并计算其MD5值。以下是一个计算文件MD5的示例: ```objc - (NSString *)md5ForFileAtPath:(NSString *)filePath { NSFileManager *fileManager = [NSFileManager ...
这样,其他模块就可以直接实例化该类并调用接口获取MD5值,提高了代码的可复用性和可维护性。 总结来说,C++中实现MD5验证主要涉及理解MD5算法的工作原理,引入并使用`openssl`库,以及正确地读取文件和处理散列值...
这个值可以用来验证文件是否被篡改,因为任何文件内容的微小改变都会导致MD5值的巨大变化。在VS2010的MFC项目中,实现文件选择和MD5计算是常见的需求。 首先,你需要创建一个MFC对话框应用程序,通过`CFileDialog`...
这个过程是单向的,即从原始数据生成MD5摘要很容易,但若从MD5值反推原始数据则极其困难,因此它具有良好的抗篡改性。 在C++中实现MD5,通常需要引入一个库,如OpenSSL库。OpenSSL提供了MD5函数接口,允许开发者...
在实际应用中,你还可以根据需求扩展功能,比如对比两个文件的MD5值以判断它们是否一致,或者将MD5值存储在数据库中以便后续的完整性验证。 需要注意的是,虽然MD5在许多非安全场景下仍可使用,但随着技术的发展,...
MD5的计算速度快,但因其易受碰撞攻击(即两个不同的输入可能产生相同的MD5值),在安全性要求高的场景下已经不再推荐使用。尽管如此,MD5仍在一些不涉及安全性的校验场景中得到应用,如文件完整性检查。 SHA1是...
这个例子中,`calculateMD5`函数接收文件路径,打开文件,逐块读取内容并计算MD5值,最后将16字节的结果转换成16进制字符串返回。 总结来说,C++6.0环境下实现MD5计算可以选择引入第三方库如OpenSSL,或者自行实现...
例如,要计算一个名为`Md5Test`的文件的MD5值,可以这样做: ```cpp CMd5 md5; ifstream file("Md5Test", ios::binary); if (file.is_open()) { char buffer[4096]; while (!file.eof()) { file.read(buffer, ...