Objective-C ,ios,iphone开发基础:iosMD5大全

来源:互联网 发布:数据库添加字段 编辑:程序博客网 时间:2024/04/29 20:25

 WsqMD5Util.h 是我自己写的开源的一个计算MD5的简单类库,秉承开源的精神,将代码共享如下:下载地址:

关于MD5的介绍可以看这里http://blog.csdn.net/shouqiangwei/article/details/12286503


//

//  WsqMD5Util.h

//  author  魏守强 

// 个人博客http://blog.csdn.net/shouqiangwei

//  Created by apple on 13-10-4.

//  Copyright (c) 2013 Shouqiang Wei. All rights reserved.

//


#import <Foundation/Foundation.h>

#import <CommonCrypto/CommonDigest.h>

#define FileHashDefaultChunkSizeForReadingData 1024*8 // 8K


@interface WsqMD5Util :NSObject


//计算NSData MD5

+(NSString*)getMD5WithData:(NSData*)data;


//计算字符串的MD5值,

+(NSString*)getmd5WithString:(NSString*)string;


//计算大文件的MD5

+(NSString*)getFileMD5WithPath:(NSString*)path;

@end


实现文件


//

//  WsqMD5Util.h

//  author  魏守强 

// 个人博客http://blog.csdn.net/shouqiangwei

//  Created by apple on 13-10-4.

//  Copyright (c) 2013 Shouqiang Wei. All rights reserved.

//


#import "WsqMD5Util.h"


@implementation WsqMD5Util


+ (NSString*)getmd5WithString:(NSString *)string{

   constchar* original_str=[stringUTF8String];

    unsignedchar digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16

   CC_MD5(original_str,strlen(original_str), digist);

    NSMutableString* outPutStr = [NSMutableStringstringWithCapacity:10];

   for(int  i =0; i<CC_MD5_DIGEST_LENGTH;i++){

        [outPutStrappendFormat:@"%02x",digist[i]];//小写x表示输出的是小写MD5,大写X表示输出的是大写MD5

    }

   return [outPutStrlowercaseString];

}


+ (NSString*)getMD5WithData:(NSData *)data{

   

   constchar* original_str=[databytes];

    unsignedchar digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16

   CC_MD5(original_str,strlen(original_str), digist);

    NSMutableString* outPutStr = [NSMutableStringstringWithCapacity:10];

   for(int  i =0; i<CC_MD5_DIGEST_LENGTH;i++){

        [outPutStrappendFormat:@"%02x",digist[i]];//小写x表示输出的是小写MD5,大写X表示输出的是大写MD5

    }

    

    /*也可以定义一个字节数组来接收计算得到的MD5

     Byte byte[16];

     CC_MD5(original_str, strlen(original_str), byte);

     NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];

     for(int  i = 0; i<CC_MD5_DIGEST_LENGTH;i++){

     [outPutStr appendFormat:@"%02x",byte[i]];

     }

     [temp release];*/

    

   return [outPutStrlowercaseString];      

    

}


+(NSString*)getFileMD5WithPath:(NSString*)path

{

    return (__bridge_transferNSString *)FileMD5HashCreateWithPath((__bridgeCFStringRef)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,(constvoid *)buffer,(CC_LONG)readBytesCount);

    }

    

    // Check if the read operation succeeded

    didSucceed = !hasMoreData;

    

    // Compute the hash digest

    unsignedchar 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,

                                       (constchar *)hash,

                                      kCFStringEncodingUTF8);

    

done:

    

   if (readStream) {

       CFReadStreamClose(readStream);

       CFRelease(readStream);

    }

   if (fileURL) {

       CFRelease(fileURL);

    }

   return result;

}


@end


原创粉丝点击