BGMD5UTils.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // BGMD5UTils.m
  3. // BuguLive
  4. //
  5. // Created by xfg on 2017/1/16.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "BGMD5UTils.h"
  9. @implementation BGMD5UTils
  10. #define CC_MD5_DIGEST_LENGTH 16
  11. + (NSString*)getmd5WithString:(NSString *)string
  12. {
  13. const char* original_str=[string UTF8String];
  14. unsigned char digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16
  15. CC_MD5(original_str, (uint)strlen(original_str), digist);
  16. NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];
  17. for(int i =0; i<CC_MD5_DIGEST_LENGTH;i++){
  18. [outPutStr appendFormat:@"%02x", digist[i]];//小写x表示输出的是小写MD5,大写X表示输出的是大写MD5
  19. }
  20. return [outPutStr lowercaseString];
  21. }
  22. + (NSString*)getMD5WithData:(NSData *)data{
  23. const char* original_str = (const char *)[data bytes];
  24. unsigned char digist[CC_MD5_DIGEST_LENGTH]; //CC_MD5_DIGEST_LENGTH = 16
  25. CC_MD5(original_str, (uint)strlen(original_str), digist);
  26. NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];
  27. for(int i =0; i<CC_MD5_DIGEST_LENGTH;i++){
  28. [outPutStr appendFormat:@"%02x",digist[i]];//小写x表示输出的是小写MD5,大写X表示输出的是大写MD5
  29. }
  30. //也可以定义一个字节数组来接收计算得到的MD5值
  31. // Byte byte[16];
  32. // CC_MD5(original_str, strlen(original_str), byte);
  33. // NSMutableString* outPutStr = [NSMutableString stringWithCapacity:10];
  34. // for(int i = 0; i<CC_MD5_DIGEST_LENGTH;i++){
  35. // [outPutStr appendFormat:@"%02x",byte[i]];
  36. // }
  37. // [temp release];
  38. return [outPutStr lowercaseString];
  39. }
  40. + (NSString*)getFileMD5WithPath:(NSString*)path
  41. {
  42. return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path,FileHashDefaultChunkSizeForReadingData);
  43. }
  44. CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,
  45. size_t chunkSizeForReadingData) {
  46. // Declare needed variables
  47. CFStringRef result = NULL;
  48. CFReadStreamRef readStream = NULL;
  49. // Get the file URL
  50. CFURLRef fileURL =
  51. CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
  52. (CFStringRef)filePath,
  53. kCFURLPOSIXPathStyle,
  54. (Boolean)false);
  55. CC_MD5_CTX hashObject;
  56. bool hasMoreData = true;
  57. bool didSucceed;
  58. if (!fileURL) goto done;
  59. // Create and open the read stream
  60. readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,
  61. (CFURLRef)fileURL);
  62. if (!readStream) goto done;
  63. didSucceed = (bool)CFReadStreamOpen(readStream);
  64. if (!didSucceed) goto done;
  65. // Initialize the hash object
  66. CC_MD5_Init(&hashObject);
  67. // Make sure chunkSizeForReadingData is valid
  68. if (!chunkSizeForReadingData) {
  69. chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
  70. }
  71. // Feed the data to the hash object
  72. while (hasMoreData) {
  73. uint8_t buffer[chunkSizeForReadingData];
  74. CFIndex readBytesCount = CFReadStreamRead(readStream,
  75. (UInt8 *)buffer,
  76. (CFIndex)sizeof(buffer));
  77. if (readBytesCount == -1)break;
  78. if (readBytesCount == 0) {
  79. hasMoreData =false;
  80. continue;
  81. }
  82. CC_MD5_Update(&hashObject,(const void *)buffer,(CC_LONG)readBytesCount);
  83. }
  84. // Check if the read operation succeeded
  85. didSucceed = !hasMoreData;
  86. // Compute the hash digest
  87. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  88. CC_MD5_Final(digest, &hashObject);
  89. // Abort if the read operation failed
  90. if (!didSucceed) goto done;
  91. // Compute the string result
  92. char hash[2 *sizeof(digest) + 1];
  93. for (size_t i =0; i < sizeof(digest); ++i) {
  94. snprintf(hash + (2 * i),3, "%02x", (int)(digest[i]));
  95. }
  96. result = CFStringCreateWithCString(kCFAllocatorDefault,
  97. (const char *)hash,
  98. kCFStringEncodingUTF8);
  99. done:
  100. if (readStream) {
  101. CFReadStreamClose(readStream);
  102. CFRelease(readStream);
  103. }
  104. if (fileURL) {
  105. CFRelease(fileURL);
  106. }
  107. return result;
  108. }
  109. @end