从Objective-C对象生成MD5哈希

我想生成一个NSObject的MD5散列:

@property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSString * type; @property (nonatomic, retain) NSString * unit; @property (nonatomic, retain) NSArray * fields; 

最好的办法是什么? 我见过从字典或数组哈希的例子,但不是从整个NSObject。

要为NSObject或NSObject的子类生成MD5哈希,需要将其转换为易于散列但仍然代表实例状态的东西。 一个JSONstring就是这样一个选项。 代码如下所示:

Model.h

 #import <Foundation/Foundation.h> @interface Model : NSObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSString * type; @property (nonatomic, retain) NSString * unit; @property (nonatomic, retain) NSArray * fields; - (NSString *)md5Hash; @end 

Model.m

 #import <CommonCrypto/CommonDigest.h> #import "Model.h" @implementation Model - (NSString *)md5Hash { // Serialize this Model instance as a JSON string NSDictionary *map = @{ @"name": self.name, @"type": self.type, @"unit": self.unit, @"fields": self.fields }; NSError *error = NULL; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:map options:NSJSONWritingPrettyPrinted error:&error]; if (error != nil) { NSLog(@"Serialization Error: %@", error); return nil; } NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; // Now create the MD5 hashs const char *ptr = [jsonString UTF8String]; unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH]; CC_MD5(ptr, strlen(ptr), md5Buffer); NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [output appendFormat:@"%02x",md5Buffer[i]]; return output; } @end 

然后,只需调用md5Hash方法即可轻松检索MD5哈希

 Model *obj = [Model new]; obj.name = @"..."; obj.type = @"..."; obj.unit = @"..."; obj.fields = @[ ... ]; NSString *hashValue = [obj md5Hash]; 

如果您已经有用于创build哈希的代码,则可以将该对象转换为字典:

 NSDictionary *dict = [myObject dictionaryWithValuesForKeys:@[@"name", @"type", @"unit", @"fields"]]; 

或者你可以在你的类上实现<NSCoding> ,存档并散列结果数据。