123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- //
- // NSString+Hash.m
- //
- #import "NSString+Hash.h"
- #import <CommonCrypto/CommonCrypto.h>
- @implementation NSString (Hash)
- #pragma mark - 散列函数
- - (NSString *)md5String {
- const char *str = self.UTF8String;
- uint8_t buffer[CC_MD5_DIGEST_LENGTH];
-
- CC_MD5(str, (CC_LONG)strlen(str), buffer);
-
- return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
- }
- - (NSString *)sha1String {
- const char *str = self.UTF8String;
- uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
-
- CC_SHA1(str, (CC_LONG)strlen(str), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
- }
- - (NSString *)sha256String {
- const char *str = self.UTF8String;
- uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
-
- CC_SHA256(str, (CC_LONG)strlen(str), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
- }
- - (NSString *)sha512String {
- const char *str = self.UTF8String;
- uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
-
- CC_SHA512(str, (CC_LONG)strlen(str), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
- }
- #pragma mark - HMAC 散列函数
- - (NSString *)hmacMD5StringWithKey:(NSString *)key {
- const char *keyData = key.UTF8String;
- const char *strData = self.UTF8String;
- uint8_t buffer[CC_MD5_DIGEST_LENGTH];
-
- CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
-
- return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
- }
- - (NSString *)hmacSHA1StringWithKey:(NSString *)key {
- const char *keyData = key.UTF8String;
- const char *strData = self.UTF8String;
- uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
-
- CCHmac(kCCHmacAlgSHA1, keyData, strlen(keyData), strData, strlen(strData), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
- }
- - (NSString *)hmacSHA256StringWithKey:(NSString *)key {
- const char *keyData = key.UTF8String;
- const char *strData = self.UTF8String;
- uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
-
- CCHmac(kCCHmacAlgSHA256, keyData, strlen(keyData), strData, strlen(strData), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
- }
- - (NSString *)hmacSHA512StringWithKey:(NSString *)key {
- const char *keyData = key.UTF8String;
- const char *strData = self.UTF8String;
- uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
-
- CCHmac(kCCHmacAlgSHA512, keyData, strlen(keyData), strData, strlen(strData), buffer);
-
- return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
- }
- #pragma mark - 文件散列函数
- #define FileHashDefaultChunkSizeForReadingData 4096
- - (NSString *)fileMD5Hash {
- NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
- if (fp == nil) {
- return nil;
- }
-
- CC_MD5_CTX hashCtx;
- CC_MD5_Init(&hashCtx);
-
- while (YES) {
- @autoreleasepool {
- NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
-
- CC_MD5_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
-
- if (data.length == 0) {
- break;
- }
- }
- }
- [fp closeFile];
-
- uint8_t buffer[CC_MD5_DIGEST_LENGTH];
- CC_MD5_Final(buffer, &hashCtx);
-
- return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
- }
- - (NSString *)fileSHA1Hash {
- NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
- if (fp == nil) {
- return nil;
- }
-
- CC_SHA1_CTX hashCtx;
- CC_SHA1_Init(&hashCtx);
-
- while (YES) {
- @autoreleasepool {
- NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
-
- CC_SHA1_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
-
- if (data.length == 0) {
- break;
- }
- }
- }
- [fp closeFile];
-
- uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
- CC_SHA1_Final(buffer, &hashCtx);
-
- return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
- }
- - (NSString *)fileSHA256Hash {
- NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
- if (fp == nil) {
- return nil;
- }
-
- CC_SHA256_CTX hashCtx;
- CC_SHA256_Init(&hashCtx);
-
- while (YES) {
- @autoreleasepool {
- NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
-
- CC_SHA256_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
-
- if (data.length == 0) {
- break;
- }
- }
- }
- [fp closeFile];
-
- uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
- CC_SHA256_Final(buffer, &hashCtx);
-
- return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
- }
- - (NSString *)fileSHA512Hash {
- NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
- if (fp == nil) {
- return nil;
- }
-
- CC_SHA512_CTX hashCtx;
- CC_SHA512_Init(&hashCtx);
-
- while (YES) {
- @autoreleasepool {
- NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
-
- CC_SHA512_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
-
- if (data.length == 0) {
- break;
- }
- }
- }
- [fp closeFile];
-
- uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
- CC_SHA512_Final(buffer, &hashCtx);
-
- return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
- }
- #pragma mark -
- /**
- * 返回二进制 Bytes 流的字符串表示形式
- *
- * @param bytes 二进制 Bytes 数组
- * @param length 数组长度
- *
- * @return 字符串表示形式
- */
- - (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
- NSMutableString *strM = [NSMutableString string];
-
- for (int i = 0; i < length; i++) {
- [strM appendFormat:@"%02x", bytes[i]];
- }
-
- return [strM copy];
- }
- @end
|