Yanıtlar:
MD5 iPhone'da kullanılabilir ve ie için bir katkı maddesi olarak ilave edilebilir NSString
ve NSData
aşağıdaki gibi.
MyAdditions.h
@interface NSString (MyAdditions)
- (NSString *)md5;
@end
@interface NSData (MyAdditions)
- (NSString*)md5;
@end
MyAdditions.m
#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access
@implementation NSString (MyAdditions)
- (NSString *)md5
{
const char *cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (int)strlen(cStr), result ); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
@implementation NSData (MyAdditions)
- (NSString*)md5
{
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( self.bytes, (int)self.length, result ); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
NSData md5 eklendi çünkü kendime ihtiyacım vardı ve bu küçük snippet'i kaydetmek için iyi bir yer olduğunu düşündüm ...
Bu yöntemler http://www.nsrl.nist.gov/testdata/ adresindeki NIST MD5 test vektörleri kullanılarak doğrulanır.
strlen
şu uyarıyı verir: "Örtülü dönüşüm tamsayı hassasiyetini kaybeder:" imzasız uzun "ila" CC_LONG "(diğer adıyla" imzasız int ")"
Bunu yapmak için yerleşik Ortak Kripto kütüphanesini kullanabilirsiniz. İçe aktarmayı unutmayın:
#import <CommonCrypto/CommonDigest.h>
ve sonra:
- (NSString *) md5:(NSString *) input
{
const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
self
çalıştırmadan önce kontrol edin ; kendini sıfır ise, çökecektir.
(int)
daha önce strlen
örneğin (int)strlen
...
Performans önemliyse, bu optimize edilmiş sürümü kullanabilirsiniz. stringWithFormat
Veya ile olanlardan yaklaşık 5 kat daha hızlıdır NSMutableString
.
Bu bir NSString kategorisidir.
- (NSString *)md5
{
const char* cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);
for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
}
resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;
NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
free(resultData);
return resultString;
}
İnsanlar bir dosya akışı sürümü istediğinden beri. MD5, SHA1 ve SHA512 ile çalışan Joel Lopes Da Silva tarafından yapılan küçük bir parçacığı değiştirdim ve akışları kullanıyor. İOS için üretilmiştir, ancak OSX'te minimum değişikliklerle çalışır (ALAssetRepresentation yöntemini kaldırın). Bir dosya yolu veya ALAssets (ALAssetRepresentation kullanarak) verilen dosyalar için sağlama toplamları yapabilir. Verileri küçük paketlere bölerek, dosya boyutuna / varlık boyutuna bakılmaksızın belleği en aza indirir.
Şu anda burada github'da bulunuyor: https://github.com/leetal/FileHash
Apple uygulamasını kullanmamak için herhangi bir neden: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1
Apple geliştirici sitesinde Şifreleme Hizmetleri Kılavuzu'nu arayın.