Antworten:
md5 ist auf dem iPhone verfügbar und kann als Ergänzung für dh NSString
und NSData
wie unten hinzugefügt werden.
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 wurde hinzugefügt, weil ich es selbst brauchte und dachte, dies sei ein guter Ort, um dieses kleine Snippet zu speichern ...
Diese Methoden werden anhand der NIST MD5-Testvektoren unter http://www.nsrl.nist.gov/testdata/ überprüft.
strlen
die Warnung ausgegeben: "Die implizite Konvertierung verliert an ganzzahliger Genauigkeit: 'unsigned long' in 'CC_LONG' (auch bekannt als 'unsigned int')"
Sie können dazu die integrierte Common Crypto-Bibliothek verwenden. Denken Sie daran zu importieren:
#import <CommonCrypto/CommonDigest.h>
und dann:
- (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
vor der Ausführung prüfen ; Wenn das Selbst Null ist, stürzt es ab.
(int)
vor strlen
zB (int)strlen
...
Wenn die Leistung wichtig ist, können Sie diese optimierte Version verwenden. Es ist ungefähr 5 mal schneller als die mit stringWithFormat
oder NSMutableString
.
Dies ist eine Kategorie von NSString.
- (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;
}
Nun, da die Leute nach einer File-Stream-Version gefragt haben. Ich habe ein nettes kleines Snippet von Joel Lopes Da Silva modifiziert, das mit MD5, SHA1 und SHA512 funktioniert UND Streams verwendet. Es wurde für iOS entwickelt, funktioniert aber auch unter OSX mit nur minimalen Änderungen (entfernen Sie die ALAssetRepresentation-Methode). Es kann Prüfsummen für Dateien erstellen, denen ein Dateipfad oder ALAssets zugewiesen wurden (mithilfe von ALAssetRepresentation). Es zerlegt Daten in kleine Pakete, wodurch die Auswirkungen auf den Speicher unabhängig von der Dateigröße / Asset-Größe minimal werden.
Es befindet sich derzeit auf Github hier: https://github.com/leetal/FileHash
Jeder Grund, die Apple-Implementierung nicht zu verwenden: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1
Suchen Sie auf der Apple-Entwicklerseite nach Cryptographic Services Guide.