从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>
,存档并散列结果数据。